如何在vert.x中泵送具有偏移量和长度的流?

时间:2018-12-06 13:10:32

标签: java kotlin stream vert.x

我正在将Kotlin Rest服务器移植到Vert.x,但是在寻找InputStream.skip()OutputStream.write(buffer, 0, len)的替代方案以及如何附加到磁盘上的文件方面遇到了一些麻烦。

是否可以使用Pump.pump()? 我必须覆盖ReadStreamWriteStream吗?

我的旧代码是:

    val fromOffset = FROM_OFFSET.getLongParam(req, false, 0)
    val toOffset = TO_OFFSET.getLongParam(req, false, -1)

    val component = repository.getComponent(contRep, docId, compId)

    component.inputStream.use { input ->
        res.outputStream.use { output ->
            input.skip(fromOffset)
            val buffer = ByteArray(64 * 1024)
            var len: Int
            var read = 0
            do {
                len = input.read(buffer)

                // Check offset
                read += len
                if (toOffset in 0..(read - 1))
                    len -= (read - toOffset).toInt()

                if (len > 0) output.write(buffer, 0, len)

            } while (len > 0)
        }
    }

此外,要附加到文件中:

    inputStream.use { appendStream ->
        FileOutputStream(componentFile, true).use { outputStream ->
            appendStream.copyTo(outputStream)
        }
    }

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以在追加模式下打开文件。然后,当您调用write时,缓冲区将移至文件末尾:

vertx.fileSystem().open(fileName, new OpenOptions().setAppend(true), ar -> {
  if (ar.succeeded()) {
    AsyncFile writestream = ar.result();
    // If you write here it will be at the end of the file
  }
});

要跳过,只需使用AsyncFile#setReadPos

vertx.fileSystem().open(fileToRead, new OpenOptions(), ar -> {
  if (ar.succeeded()) {
    AsyncFile readstream = ar.result();
    rs.setReadPos(offset);
  }
}

完成后,您可以使用常用的泵代码:

Pump pump = Pump.pump(readstream, writestream);
readstream.endHandler(v -> {
  // Done
});
pump.start();

这些都是Java代码段,但您可以轻松转换为Kotlin语法。