Я портирую сервер 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)
}
}
заранее спасибо
@AlexeySoshin Vert.x / Kotlin, но я думаю, что каждый Java API Vert.x можно использовать и из Kotlin




Вы можете открыть файл в режиме добавления. Затем, когда вы вызываете 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.
Спасибо @tsegismont, а как ограничить количество записываемых байтов?
Вы не можете сделать это напрямую с помощью насоса, вам придется работать с данными pause / resume и drainHandler самостоятельно (см. vertx.io/docs/vertx-core/java/#streams)
Вы переносите его на Vert.x / Java или на Vert.x / Kotlin? Если это позже, я предлагаю просто обернуть ваш код в рабочую область и продолжить другие задачи. Если это первое, вы можете использовать
vertx.fileSystem().readFileдля получения аналогичных результатов.