Как качать потоки со смещением и длиной в vert.x? - PullRequest
0 голосов
/ 06 декабря 2018

Я портирую сервер отдыха kotlin на 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)
        }
    }

Заранее спасибо

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете открыть файл в режиме добавления.Затем, когда вы вызываете 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.

...