Добавить функцию обратного вызова в поток Java - PullRequest
0 голосов
/ 31 января 2019

Допустим, я хочу выполнить следующие операции:

  • Вывести список файлов в данном каталоге (в виде потока)
  • Отобразить каждый файл (путь) в Reader (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 голосов
/ 07 февраля 2019

В конце я пошел немного по-другому.Я расширил класс 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
  }
}
0 голосов
/ 01 февраля 2019

Вы можете использовать опцию 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);
...