当前位置: 首页 > 知识库问答 >
问题:

码头运营是否关闭了河流?

周鸿运
2023-03-14

diPath包含200k个文件,我想一个一个地读取它们并做一些处理。下面的代码片段导致java.nio.file.FileSystemException:diPath/file-N打开的文件太多。终端操作foreach()不是应该在移动到下一个之前关闭打开的流(即打开的文件)吗?换句话说,我必须为流式文件添加try-with-资源吗?

Files.list(dirPath)
     .forEach(filePath -> {
              Files.lines(filePath).forEach() { ... }
              });

共有2个答案

祁承望
2023-03-14
匿名用户

在大多数情况下,每个的嵌套是错误的工具。

代码

Files.list(dirPath).forEach(filePath -> Files.lines(filePath).forEach(line -> { ... });

可以并且应该被替换为

Files.list(dirPath).flatMap(filePath -> Files.lines(filePath)).forEach(line -> { ... });

或者,既然在这种情况下没有那么容易:

Files.list(dirPath).flatMap(filePath -> {
    try { return Files.lines(filePath);}
    catch(IOException ex) { throw new UncheckedIOException(ex); }
}).forEach(line -> {  });

作为副作用,您可以免费获得以下内容:

每个映射流在其内容放入该流后关闭。

所以这是首选的解决方案。或者,为了使其完全正确:

try(Stream<Path> dirStream = Files.list(dirPath)) {
    dirStream.flatMap(filePath -> {
        try { return Files.lines(filePath);}
        catch(IOException ex) { throw new UncheckedIOException(ex); }
    }).forEach(line -> { });
}

洪季萌
2023-03-14

NoforEach不会关闭流(由文件列表或文件行创建)。它被记录在javadoc中,例如文件。列表:

返回的流封装了一个Reader。如果需要及时处理文件系统资源,则应使用try-with-资源构造来确保在流操作完成后调用流的关闭方法。

 类似资料:
  • JavaDoc for没有提到关闭底层的: https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close-- 从课堂上复制的描述:Reader 关闭流并释放与之关联的所有系统资源。流关闭后,进一步的read()、ready()、mark()、reset()或skip()调用将抛出IOException。

  • 我经常在日志中看到以下异常: 我发现当抛出时,没有什么要做的,所以我不确定为什么该异常被记录为ERROR。

  • 问题内容: 我想知道,在关闭阅读器之后,是否需要关闭InputStream? 问题答案: 不,您不必。 由于Java中用于流的装饰器方法可以通过将新流或读取器附加到其他流上来构建新流或读取器,因此实现将自动对其进行处理。 如果查看其来源,则会看到: 因此,关闭操作实际上关闭了底层的流读取器。 编辑:我想确保关闭也可以在输入流上工作,请继续关注。 签入 在调用sd的close时调用。

  • 我有一个spring应用程序,它的主页发出多个ajax调用,这些调用反过来从DB中提取数据并返回。DB已配置连接池,minPoolSize为50,maxPoolSize为100。 现在,当我打开主页时,大约有7个连接与DB建立,这是因为大约有7个ajax调用被调用,我假设所有调用都创建了自己的连接。现在,当我刷新页面时,我看到又建立了7个新连接(我看到db2监控中总共有14个物理连接),这似乎出乎

  • 问题内容: 我有这段代码可以使用带有curl的Simple DOM Parser登录到Google。我尝试添加cookiejar文件,但无济于事。我不断收到消息: 您的浏览器的cookie功能被关闭。 请打开它。 关于如何解决这个问题的任何想法? 这是我的代码供参考: 问题答案: 这是一些经过修改的代码。 它首先请求登录页面获取初始cookie,并提取登录表单所需的值。接下来,它执行登录服务的发布

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家