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_marmotstreamSingleLineLogMessages
将抛出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
}