假设我要执行以下操作:
代码看起来像这样:
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时,该文件将不存在,因此我需要在流被消耗后才能运行的文件。
有想法吗?
答案 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
}
}