gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:52 25 4
gpt4 key购买 nike

我正在将 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)
}
}

提前致谢

最佳答案

您可以以追加模式打开文件。然后,当您调用 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 语法。

关于java - 如何在 vert.x 中泵送具有偏移量和长度的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53652232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com