Java 8 路径流和 FileSystemException(打开的文件太多)
Java 8 Path Stream and FileSystemException (Too many open files)
天才!
我在练习Java8.
所以如果我这样做:
Files.walk(Paths.get(corpusPathStr))
.filter(path -> path.toFile().isFile())
.forEach(path -> {
try {
Files.lines(path)
.forEach(...);
} catch (IOException e) {
e.printStackTrace();
}
});
我收到 FileSystemException 错误。
如果我在forEach下打开一个文件,会不会打开太多文件?
或者是否有其他原因导致 FileSystemException(打开的文件太多)?
提前感谢您的帮助!
Files::line
以惰性方式打开和读取文件,即 Stream<String>
。由于您没有关闭任何打开的 Stream
,因此您会收到这样的错误。
因此,当您读完一个文件后,您应该关闭它的句柄。由于返回的 Stream
是 AutoCloseable
,您可以而且应该使用 try-with-resource 块。
try (Stream<Path> walk = Files.walk(Paths.get(""))) {
walk.filter(Files::isRegularFile).forEach(path -> {
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
使用
try(Stream<Path> stream = Files.walk(Paths.get(corpusPathStr))) {
stream.filter(path -> Files.isRegularFile(path) && Files.isReadable(path))
.flatMap(path -> {
try { return Files.lines(path); }
catch (IOException e) { throw new UncheckedIOException(e); }
})
.forEach(...);
}
catch(UncheckedIOException ex) {
throw ex.getCause();
}
Files.walk
和 Files.lines
返回的流必须正确关闭以释放资源,您可以通过 try(…)
构造或在映射函数中返回它们来释放资源flatMap
操作。
不要使用嵌套的 forEach
s。
UncheckedIOException
可能不仅由我们的映射函数抛出,而且流实现也可能抛出。将其翻译回 IOException
允许平等对待它们。
天才!
我在练习Java8.
所以如果我这样做:
Files.walk(Paths.get(corpusPathStr))
.filter(path -> path.toFile().isFile())
.forEach(path -> {
try {
Files.lines(path)
.forEach(...);
} catch (IOException e) {
e.printStackTrace();
}
});
我收到 FileSystemException 错误。
如果我在forEach下打开一个文件,会不会打开太多文件?
或者是否有其他原因导致 FileSystemException(打开的文件太多)?
提前感谢您的帮助!
Files::line
以惰性方式打开和读取文件,即 Stream<String>
。由于您没有关闭任何打开的 Stream
,因此您会收到这样的错误。
因此,当您读完一个文件后,您应该关闭它的句柄。由于返回的 Stream
是 AutoCloseable
,您可以而且应该使用 try-with-resource 块。
try (Stream<Path> walk = Files.walk(Paths.get(""))) {
walk.filter(Files::isRegularFile).forEach(path -> {
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
使用
try(Stream<Path> stream = Files.walk(Paths.get(corpusPathStr))) {
stream.filter(path -> Files.isRegularFile(path) && Files.isReadable(path))
.flatMap(path -> {
try { return Files.lines(path); }
catch (IOException e) { throw new UncheckedIOException(e); }
})
.forEach(...);
}
catch(UncheckedIOException ex) {
throw ex.getCause();
}
Files.walk
和 Files.lines
返回的流必须正确关闭以释放资源,您可以通过 try(…)
构造或在映射函数中返回它们来释放资源flatMap
操作。
不要使用嵌套的 forEach
s。
UncheckedIOException
可能不仅由我们的映射函数抛出,而且流实现也可能抛出。将其翻译回 IOException
允许平等对待它们。