使用Vert.x逐行读取文件(AsyncFile和RecordParser帮助)

时间:2018-04-05 03:45:33

标签: asynchronous inputstream vert.x

我尝试使用Vert.x从文件系统中读取大文件并逐行处理。在核心文档中,我认为这样做的方法是AsyncFileRecordParser。理想情况下,我希望Pump数据(以避免背压),但RecordParser不是WriteStream

AsyncFile asyncFile = vertx.fileSystem().openBlocking(/*path and options*/);

RecordParser recordParser = RecordParser.newDelimited("\n", bufferedLine -> {
  // Do something per line
});

Pump.pump(asyncFile, recordParser).start(); // Error - RecordParser cannot be converted to WriteStream

所以我想我必须自己抽水?我试过像:

RecordParser recordParser = RecordParser.newDelimited("\n", bufferedLine -> {
  // Do something per line
  // I can see this code get run
})
.exceptionHandler(cause -> {
  // Do I need this? What are the repercussions if I don't have this handler? Are exceptions just lost?
})
.endHandler(_void -> {
  // This never gets called!
});

asyncFile.handler(recordParser); // Crazy Java8 syntax passes recordParser.handle to this handler :)

但是,我不确定我的文件是否被关闭,因为recordParser.endHandler永远不会被调用(尽管我可以看到调用行处理程序)。

我做错了什么?文件没有关闭吗?我尝试将endHandler添加到asyncFile并关闭它,但这不起作用。

理想情况下,我宁愿让Pump工作。在这种情况下有没有办法使用Pump

提前致谢!

P.S。:原谅"crosspost"

1 个答案:

答案 0 :(得分:3)

如您所说,您可以使用AsyncFileRecordParser

RecordParser recordParser = RecordParser.newDelimited("\n", bufferedLine -> {
  System.out.println("bufferedLine = " + bufferedLine);
});

asyncFile.handler(recordParser)
    .endHandler(v -> {
      asyncFile.close();
      System.out.println("Done");
    });

如果你这样做,你应该在AsyncFile而不是RecordParser上设置一个例外处理程序。

使用上面的代码,文件将被正确关闭。

  

但是,我不确定我的文件是否被关闭,因为recordParser.endHandler永远不会被调用(尽管我可以看到调用行处理程序)。

实际上,endHandlerexceptionHandler只有在通过换行RecordParser创建ReadStream时才会被调用。在你的情况下,他们没有必要。

另外,关于你的评论:

  

// Crazy Java8语法将recordParser.handle传递给此处理程序:)

这不是Java 8技巧,只是AsyncFile.handler()期望Handler<Buffer>RecordParser实现此接口。