Flux和FileInputStream未被关闭



根据文档:

// input file
Path ipPath = Paths.get("/some/path/large-input-file.txt");

Flux<String> stringFlux = Flux.using(
() -> Files.lines(ipPath),
Flux::fromStream,
Stream::close
);

这段代码是从输入流读取,但文件。lines不是UTF-8编码的。正如这里所提到的,所以我使用FileInputStream代替,如下面的代码所示:

// input file
Path ipPath = Paths.get("/some/path/large-input-file.txt");

Flux<String> stringFlux = Flux.using(
() -> {
final var fileInputStream=new FileInputStream(ipPath.toFile());
final var isr=new InputStreamReader(fileInptStream,StandarCharsets.UTF_8);
final var bufferReader=new BufferReader(isr);
return bufferReader.lines();
},
Flux::fromStream,
Stream::close
);

我所面临的问题,输入文件流处理后没有关闭,请建议

有两种方法可以解决这个问题:

  • useFiles.lines(Path, Charset)overload
  • 在flux提供程序内部进行包装,并保留fileInputStream作为资源:
Flux<String> stringFlux = Flux.using(
() -> Files.lines(ipPath, StandardCharsets.UTF_8),
Flux::fromStream,
Stream::close
);
Flux.using(() -> new FileInputStream(ipPath.toFile()),
fileInputStream -> {
final var isr = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
final var bufferReader = new BufferedReader(isr);
return Flux.fromStream(bufferReader.lines());
},
is -> {
try {
is.close();
} catch (IOException ex) {
throw Exceptions.bubble(ex);
}
}
);

最新更新