Как качать потоки со смещением и длиной в vert.x?

Я портирую сервер 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)
        }
    }

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

Вы переносите его на Vert.x / Java или на Vert.x / Kotlin? Если это позже, я предлагаю просто обернуть ваш код в рабочую область и продолжить другие задачи. Если это первое, вы можете использовать vertx.fileSystem().readFile для получения аналогичных результатов.

Alexey Soshin 06.12.2018 14:41

@AlexeySoshin Vert.x / Kotlin, но я думаю, что каждый Java API Vert.x можно использовать и из Kotlin

Teg 06.12.2018 15:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
596
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Teg 07.12.2018 17:38

Вы не можете сделать это напрямую с помощью насоса, вам придется работать с данными pause / resume и drainHandler самостоятельно (см. vertx.io/docs/vertx-core/java/#streams)

tsegismont 07.12.2018 18:19

Другие вопросы по теме