向Java流添加回调函数

时间:2019-01-31 20:55:52

标签: java java-8 java-stream

假设我要执行以下操作:

  • 列出给定目录中的文件(作为流)
  • 将每个文件(路径)映射到读取器(例如,BufferedReader)中,以供使用者使用。
  • 使用完文件后,删除文件

代码看起来像这样:

Stream<Reader> stream = Files.list(Paths.get("myFolder")) // Returns a stream of Path
  .callback(Files::delete)                                // This would have to be called after the reader has been consumed
  .map(Files::newBufferedReader);                         // Maps every path into a Reader

如果我使用peek()删除文件,那么当需要将其映射到Reader时,该文件将不存在,因此我需要在流被消耗后才能运行的文件。 有想法吗?

2 个答案:

答案 0 :(得分:11)

您可以使用DELETE_ON_CLOSE选项:

Stream<Reader> stream = Files.list(Paths.get("myFolder"))
        // TODO handle IOException
        .map(path -> Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE))
        .map(InputStreamReader::new)
        .map(BufferedReader::new);

答案 1 :(得分:0)

最后我采用了稍微不同的方法。 我扩展了Reader类,并创建了一个包装器,然后,我简单地覆盖了close()方法,以在使用完阅读器后对该文件执行一些其他操作(即,重命名,删除,移动等)。

public class CustomReader extends Reader {
  private Reader reader;
  private File file;

  public CustomReader(File file) {
    this.file = file;
    this.reader = new FileReader(file);
  } 

  [...]
  @Override
  public void close() {
    super.close();
    // Do what you need to do with your file
  }
}