用反应器逐行读取文本文件
Read text file line by line with reactor
我想使用 Flux 读取文件。基本上我想做的是将 spring-boot jar 中的文本文件转换为 Flux<String>
@SneakyThrows
@Override
public Flux<String> getLines() {
final InputStream inputStream = new ClassPathResource(pathToFile).getInputStream();
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
return Flux.using(
bufferedReader::lines,
Flux::fromStream,
stringStream -> {
close(inputStreamReader);
close(bufferedReader);
stringStream.close();
}
);
}
private void close(final Closeable closeable) {
try {
closeable.close();
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
我不确定我这样做是否正确,以及如何改进它(但它工作正常)
编辑:
我将其重构为:
return Flux.using(
() -> new ClassPathResource(pathToFile).getInputStream(),
is -> Flux.using(
() -> new InputStreamReader(is),
isr -> Flux.using(
() -> new BufferedReader(isr),
br -> Flux.using(
br::lines,
Flux::fromStream,
BaseStream::close
),
this::close
),
this::close
),
this::close
)
我将其重构为:
return Flux.using(
() -> new ClassPathResource(pathToFile).getInputStream(),
is -> Flux.using(
() -> new InputStreamReader(is),
isr -> Flux.using(
() -> new BufferedReader(isr),
br -> Flux.using(
br::lines,
Flux::fromStream,
BaseStream::close
),
this::close
),
this::close
),
this::close
)
它工作正常
我想使用 Flux 读取文件。基本上我想做的是将 spring-boot jar 中的文本文件转换为 Flux<String>
@SneakyThrows
@Override
public Flux<String> getLines() {
final InputStream inputStream = new ClassPathResource(pathToFile).getInputStream();
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
return Flux.using(
bufferedReader::lines,
Flux::fromStream,
stringStream -> {
close(inputStreamReader);
close(bufferedReader);
stringStream.close();
}
);
}
private void close(final Closeable closeable) {
try {
closeable.close();
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
我不确定我这样做是否正确,以及如何改进它(但它工作正常)
编辑: 我将其重构为:
return Flux.using(
() -> new ClassPathResource(pathToFile).getInputStream(),
is -> Flux.using(
() -> new InputStreamReader(is),
isr -> Flux.using(
() -> new BufferedReader(isr),
br -> Flux.using(
br::lines,
Flux::fromStream,
BaseStream::close
),
this::close
),
this::close
),
this::close
)
我将其重构为:
return Flux.using(
() -> new ClassPathResource(pathToFile).getInputStream(),
is -> Flux.using(
() -> new InputStreamReader(is),
isr -> Flux.using(
() -> new BufferedReader(isr),
br -> Flux.using(
br::lines,
Flux::fromStream,
BaseStream::close
),
this::close
),
this::close
),
this::close
)
它工作正常