【问题标题】:Read large file using vertx使用 vertx 读取大文件
【发布时间】:2017-08-14 14:39:55
【问题描述】:

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

有没有其他选择?

【问题讨论】:

  • 我认为vertx没有这种api。为什么不使用其他 java 解决方案读取文件?

标签: vert.x


【解决方案1】:

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

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

那么AsyncFileReadStream,因此您可以将它与 Pump 一起使用以将位复制到 WriteStream

Pump.pump(file, output).start();
file.endHandler((r) -> {
    System.out.println("Copy done");
});

有不同类型的WriteStream,例如AsyncFile、网络套接字、HTTP 服务器响应等等。

【讨论】:

    【解决方案2】:

    要读取/处理块中的大文件,您需要使用open() 方法,该方法将在成功时返回AsyncFile。在这个AsyncFile 上你setReadBufferSize()(或不,默认为8192),并附加一个handler(),它将传递一个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

    【讨论】:

      【解决方案3】:

      原因是.readFile 内部调用Files.readAllBytes

      您应该做的是从文件中创建一个流,并将其传递给 Vertx 处理程序:

          try (InputStream steam = new FileInputStream("target/classes/readme.txt")) {
              // Your handling here
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-02
        • 2023-03-28
        • 2013-11-28
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多