使用vertx读取大文件

时间:2017-08-14 14:39:56

标签: vert.x

我是使用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也提示 请勿使用此方法读取非常大的文件,否则可能会耗尽可用内存。

还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

要阅读大文件,您应该打开AsyncFile

OpenOptions options = new OpenOptions();
fileSystem.open("myfile.txt", options, res -> {
    if (res.succeeded()) {
        AsyncFile file = res.result();
    } else {
        // Something went wrong!
    }
});

然后AsyncFileReadStream,因此您可以将它与泵一起使用,将这些位复制到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}}。