【问题标题】:Close a stream without assigning it to a variable [Java]关闭流而不将其分配给变量 [Java]
【发布时间】:2021-03-03 07:23:14
【问题描述】:

我正在使用 nio Files.lines 方法读取一个大文件,并将其写入另一个文件。

BufferedWriter writer = Files.newBufferedWriter(Path.of(outFile);

         Files.lines(Path.of(inputFile))
                .forEach(line -> {
                    try {
                        writer.write(line);
                        writer.newLine();
                    } catch (IOException e) {
                        throw new UncheckedIOException(e);
                    }
                });
        writer.flush();
        writer.close();
    

我想在 finally 块中关闭编写器和流 (Files.lines)。 我知道我必须将这个 sn-p 包围在一个 try-catch-finally 块中,但是如何在不将其分配给变量的情况下关闭流?

【问题讨论】:

  • 如果不将其分配给变量,您将无法关闭。你怎么能写它,而不分配给一个变量?
  • 使用Files.copy(Path.of(inputFile), Path.of(outFile))。将文件的字节解码为字符,识别换行符,将文本分解为行字符串,在编写器的缓冲区中再次连接行,并在您可以首先按原样复制字节时再次将其编码为字节是没有意义的.特别是对于“大文件”。
  • @GauthamM 因为Files.lines(…) 的规范是这样说的:“此方法必须在 try-with-resources 语句或类似的控制结构中使用,以确保关闭流的打开文件在流的操作完成后立即进行。
  • 这能回答你的问题吗? Close Java 8 Stream

标签: java java-8 java-stream try-with-resources


【解决方案1】:

不要做大量的手工工作,只需使用以下 sn-p(正如您在 cmets 中已经被告知的那样):

Files.copy(Path.of(inputFile), Path.of(outFile)));

如果您出于某种原因仍想手动执行此操作,请使用 try-with-resources。您仍将BufferedWriter 分配给变量,但无需显式关闭它。 Java 会自己做:

try(BufferedWriter writer = Files.newBufferedWriter(Path.of(outFile));
    Stream<String> lines = Files.lines(Path.of(inputFile))) {
    // ... do something with your lines & writer here
}

【讨论】:

  • @DidierL 哦,对。我忽略了这一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多