Подключите InputStream из запущенного процесса в Java/KotlinJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Подключите InputStream из запущенного процесса в Java/Kotlin

Сообщение Anonymous »

Я запускаю процесс с помощью ProcessBuilder следующим образом:

val pb = ProcessBuilder("/path/to/process")
pb.redirectErrorStream(true)
val proc = pb.start()


Я хотел бы сделать две вещи со стандартным выводом процесса:
  • < li>Постоянно отслеживать последнюю строку вывода.
  • Записывать все строки в файл.
Насколько я могу судить, чтобы сделать обе эти вещи, мне нужно «разделить» входной поток, который я получаю из proc.inputStream, чтобы каждая строка зеркально отображалась в двух других входных потоках: один можно использовать для входа в файл, а другой — для анализа и мониторинга состояния процесса.

Одним из вариантов было бы создать поток, который читает из InputStream, инициирует событие с каждой строкой, прочитанной «подписчикам», и я думаю, что это должно работать нормально, но я надеялся придумать более универсальная функциональность типа «Тройник», которая раскрывает Входные потоки, которые будут использоваться кем угодно. В основном примерно так:

val pb = ProcessBuilder("/path/to/process")
pb.redirectErrorStream(true)
val proc = pb.start()
val originalInputStream = proc.inputStream

val tee = Tee(originalInputStream)
// Every line read from originalInputStream would be
// mirrored to all branches (not necessarily every line
// from the beginning of the originalInputStream, but
// since the start of the lifetime of the created branch)
val branchOne: InputStream = tee.addBranch()
val branchTwo: InputStream = tee.addBranch()


Я попробовал класс Tee, но не знаю, что делать в методе addBranch:

class Tee(inputStream: InputStream) {
val reader = BufferedReader(InputStreamReader(inputStream))
val branches = mutableListOf()

fun readLine() {
val line = reader.readLine()
branches.forEach {
it.write(line.toByteArray())
}
}

fun addBranch(): InputStream {
// What to do here? Need to create an OutputStream
// which readLine can write to, but return an InputStream
// which will be updated with each future write to that
// OutputStream
}
}


РЕДАКТИРОВАТЬ: Реализация Tee, которую я получил, была следующей:

/**
* Reads from the given [InputStream] and mirrors the read
* data to all of the created 'branches' off of it.
* All branches will 'receive' all data from the original
* [InputStream] starting at the the point of
* the branch's creation.
* NOTE: This class will not read from the given [InputStream]
* automatically, its [read] must be invoked
* to read the data from the original stream and write it to
* the branches
*/
class Tee(inputStream: InputStream) {
val reader = BufferedReader(InputStreamReader(inputStream))
var branches = CopyOnWriteArrayList()

fun read() {
val c = reader.read()

branches.forEach {
// Recreate the carriage return so that readLine on the
// branched InputStreams works
it.write(c)
}
}

fun addBranch(): InputStream {
val outputStream = PipedOutputStream()
branches.add(outputStream)
return PipedInputStream(outputStream)
}
}


Подробнее здесь: https://stackoverflow.com/questions/490 ... ava-kotlin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Есть ли способ узнать количество объектов C++ и их типы запущенного процесса?
    Anonymous » » в форуме C++
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Как использовать Marshal.getActiveObject(), чтобы получить 2 экземпляра запущенного процесса, в котором открыты два проц
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Android Kotlin uri в inputstream
    Anonymous » » в форуме Android
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Android Kotlin uri в inputstream
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Java: уничтожение потока, запущенного как Runnable с помощью ExecutorService
    Anonymous » » в форуме JAVA
    0 Ответы
    82 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»