Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一个流映射到另一个流,并在第二个流关闭时关闭第一个流_Java_Eclipse_Resources_Java 8_Java Stream - Fatal编程技术网

Java 将一个流映射到另一个流,并在第二个流关闭时关闭第一个流

Java 将一个流映射到另一个流,并在第二个流关闭时关闭第一个流,java,eclipse,resources,java-8,java-stream,Java,Eclipse,Resources,Java 8,Java Stream,我有一个日志文件,我想用它的每一行创建一个LogMessage对象。我想将文件中的行流化,并将每一行映射到新的LogMessage。下面的代码可以工作,但Eclipse会发出警告: 资源泄漏:“lineStream”从未关闭 publicstaticstreamsinglelinelogmessages(路径){ 试一试{ Stream lineStream=Files.lines(路径,StandardCharsets.ISO_8859_1); 流日志消息流= map(消息->新日志消息(路径

我有一个日志文件,我想用它的每一行创建一个
LogMessage
对象。我想将文件中的行流化,并将每一行映射到新的
LogMessage
。下面的代码可以工作,但Eclipse会发出警告:

资源泄漏:“lineStream”从未关闭

publicstaticstreamsinglelinelogmessages(路径){
试一试{
Stream lineStream=Files.lines(路径,StandardCharsets.ISO_8859_1);
流日志消息流=
map(消息->新日志消息(路径,消息));
logMessageStream.onClose(lineStream::close);
返回logMessageStream;
}捕获(IOE异常){
抛出新的运行时异常(e);
}
}
如果我添加一个
finally
块,并在其中关闭它,那么当方法返回时,流就关闭了(我想)。无论如何,当我开始使用它时,它已经关闭了


那么,确保内部流程关闭的最佳方法是什么?或者,代码本身是正确的,但Eclipse没有意识到这一点?

您实际上不需要这些,而是需要:

public static Stream<LogMessage> streamSingleLineLogMessages(Path path) throws IOException {
    return Files.lines(path, StandardCharsets.ISO_8859_1)
                .map(message -> new LogMessage(path, message));
}

我使用
streamSingleLineLogMessages
作为lambda函数。因此它不能抛出选中的异常。@whistling_marmot
streamSingleLineLogMessages
将抛出
IOException
,如果
文件.lines
抛出异常。但是,内联
行流
(与您的代码一样)会使eclipse警告消失,即使我保留了try-catch.com,结果发现资源泄漏分析还没有针对Java8方法引用进行更新。我在等待了很长时间后提交了文件,从tomorrows integration build开始,Eclipse只会报告潜在的资源泄漏(本地分析仍然无法做出明确的决定)。
public static Stream<LogMessage> streamSingleLineLogMessages(Path path) throws IOException {
    return Files.lines(path, StandardCharsets.ISO_8859_1)
                .map(message -> new LogMessage(path, message));
}
try (Stream<LogMessage> messageStream = streamSingleLineLogMessages(path)) {
    // do something with the stream
}