我是使用vertx的新手,我使用vertx文件系统api来读取大尺寸的文件。
vertx.fileSystem().readFile("target/classes/readme.txt", result -> {
if (result.succeeded()) {
System.out.println(result.result());
} else {
System.err.println("Oh oh ..." + result.cause());
}
});
但是RAM在读取时全部消耗掉,资源在使用后甚至没有被刷新。 vertx文件系统api也提示 请勿使用此方法读取非常大的文件,否则可能会耗尽可用内存。
还有其他选择吗?
答案 0 :(得分:2)
要阅读大文件,您应该打开AsyncFile
:
OpenOptions options = new OpenOptions();
fileSystem.open("myfile.txt", options, res -> {
if (res.succeeded()) {
AsyncFile file = res.result();
} else {
// Something went wrong!
}
});
然后AsyncFile
是ReadStream
,因此您可以将它与泵一起使用,将这些位复制到WriteStream
:
Pump.pump(file, output).start();
file.endHandler((r) -> {
System.out.println("Copy done");
});
有WriteStream
种类,AsyncFile
,网络套接字,HTTP服务器响应等等。
答案 1 :(得分:0)
原因是内部.readFile
调用Files.readAllBytes
。
您应该做的是从文件中创建一个流,并将其传递给Vertx处理程序:
try (InputStream steam = new FileInputStream("target/classes/readme.txt")) {
// Your handling here
}
答案 2 :(得分:0)
要以块的形式读取/处理大型文件,您需要使用open()
方法,该方法将成功返回AsyncFile
。在AsyncFile
setReadBufferSize()
上handler()
(或不是,默认值为8192),并附加一个Buffer
,它将传递最多为读取缓冲区大小的endHandler()
你刚刚设定。
在下面的示例中,我还附加了一个vertx.fileSystem().open("target/classes/readme.txt", new OpenOptions().setWrite(false).setCreate(false), result -> {
if (result.succeeded()) {
result.result().setReadBufferSize(READ_BUFFER_SIZE).handler(data -> System.out.print(data.toString()))
.endHandler(v -> System.out.println());
} else {
System.err.println("Oh oh ..." + result.cause());
}
});
来打印最终换行符,以便与您在问题中提供的示例代码保持一致:
READ_BUFFER_SIZE
您当然需要在某处定义{{1}}。