我尝试使用Vert.x从文件系统中读取大文件并逐行处理。在核心文档中,我认为这样做的方法是AsyncFile
和RecordParser
。理想情况下,我希望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"。
答案 0 :(得分:3)
如您所说,您可以使用AsyncFile
和RecordParser
。
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永远不会被调用(尽管我可以看到调用行处理程序)。
实际上,endHandler
和exceptionHandler
只有在通过换行RecordParser
创建ReadStream
时才会被调用。在你的情况下,他们没有必要。
另外,关于你的评论:
// Crazy Java8语法将recordParser.handle传递给此处理程序:)
这不是Java 8技巧,只是AsyncFile.handler()
期望Handler<Buffer>
和RecordParser
实现此接口。