我正在将Kotlin Rest服务器移植到Vert.x,但是在寻找InputStream.skip()
,OutputStream.write(buffer, 0, len)
的替代方案以及如何附加到磁盘上的文件方面遇到了一些麻烦。
是否可以使用Pump.pump()
?
我必须覆盖ReadStream
和WriteStream
吗?
我的旧代码是:
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)
}
}
预先感谢
答案 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语法。