Не могу понять использование входного потока и выходного потока

1

Я смущен в отношении использования потока ввода и потока вывода. Из вопроса запутались в stdin, stdout и stderr? :

Стандартный ввод - это дескриптор файла, который ваш процесс читает, чтобы получить от вас информацию.

Стандартный вывод - ваш процесс записывает нормальную информацию в этот дескриптор файла.

Я пытался запустить внешний процесс (сценарий python) с помощью java.Which является интерактивным и требует ввода от пользователя.

Теперь, когда концепция гласит:

стандартный ввод используется, когда ваш процесс читает, чтобы получить от вас информацию.

Поэтому я должен получить поток ввода из процесса для записи значений в него. Я попытался это сделать и не смог. Так что я искал переполнение стека, задал вопрос с той же проблемой, что и поток вывода из процесса, а затем писал ему. пробовал, что и сработал.

Мой вопрос в том, почему это сработало? Разве это не должен быть поток ввода, который я должен использовать, чтобы дать вход для этого внешнего процесса, или я понял, что поток ввода и выходной поток полностью неправильны.

Пожалуйста, помогите мне понять это с легким объяснением.

Изменение: Мой код:

 Process process=Runtime.getRuntime().exec("/usr/bin/python /home/abhijeet/test.py");
    OutputStream  stdin = process.getOutputStream ();
    String line = "30" + "\n";
    stdin.write(line.getBytes() );
Теги:
stream
inputstream
outputstream

2 ответа

2
Лучший ответ

Приложение должно всегда записывать данные в выходной поток родительского процесса и читать из входного потока родительского процесса. Для процессов всякий раз, когда создается дочерний процесс, родительский процесс подает данные в поток входных данных вспомогательного процесса и считывает из выходного потока подпроцесса.

По умолчанию созданный подпроцесс не имеет собственного терминала или консоли. Все его стандартные операции ввода-вывода (т.е. stdin, stdout, stderr) будут перенаправлены на родительский процесс, к которым можно получить доступ через потоки, полученные с помощью методов getOutputStream(), getInputStream() и getErrorStream(). Родительский процесс использует эти потоки для подачи ввода и получения вывода из подпроцесса.

public abstract OutputStream getOutputStream()

Возвращает выходной поток, подключенный к нормальному входу подпроцесса. Вывод в поток поступает в стандартный ввод процесса, представленного этим объектом Process.

Приложение подает данные в выходной поток родительского процесса, и эти данные будут переданы во входной поток подпроцесса.

public abstract InputStream getInputStream()

Возвращает входной поток, подключенный к нормальному выходу подпроцесса. Поток получает данные, поступающие из стандартного вывода процесса, представленного этим объектом Process.

Родительский процесс считывает данные из вывода подпроцесса. Приложение считывает данные из входного потока родительского процесса.

В вашем коде:

Process process=Runtime.getRuntime().exec("/usr/bin/python /home/abhijeet/test.py");
OutputStream  stdin = process.getOutputStream ();
String line = "30" + "\n";
stdin.write(line.getBytes() );

Программа java, которую вы запускаете, является родительским процессом. Сценарий python, который вы запускаете, является дочерним процессом. process.getOutputStream() возвращает вам выходной поток родительского процесса. Не путайте здесь. Этот метод не возвращает выходной поток вспомогательного процесса. Прочтите документацию, которую я процитировал выше.

Теперь вы пишете "30\n" для вывода потока родительского процесса, который теперь передается в поток ввода сценария скрипта python и становится доступным для скрипта для чтения.

  • 0
    Приложение всегда должно читать из входного потока родительского процесса. Почему мне нужно взять выходной поток процесса для передачи данных в скрипт Python?
  • 0
    Поскольку для передачи данных в подпроцесс необходимо записать данные во входной поток подпроцесса. Поэтому вам нужно записать в выходной поток родительского процесса, который будет передан во входной поток подпроцесса. Я думаю, что здесь выполнение вашего сценария Python будет подпроцесс.
Показать ещё 3 комментария
1

OutputStream как следует из названия, предназначен для записи вывода в поток (который может входить в файл, но также может быть другим типом потока).

InputStream также используется для чтения ввода из потока.

Вы могли видеть эти классы как противоположные концы одного и того же потока: производитель/сервер записывает в выходной поток, потребитель/клиент читает из входного потока.

стандартный ввод используется, когда ваш процесс читает, чтобы получить от вас информацию.

Это будет описывать поток с пользовательской точки зрения. Для вас это поток вывода, поскольку вы вводите данные с помощью консоли, для процесса, который считывает эти данные, это поток ввода, поскольку он считывает данные, введенные вами в поток.

Небольшая visuablization:

User/Console                      Process/Application
(OutputStream) ------ data ----> (InputStream)
(InputStream)  <--- feedback --- (OutputStream)   
  • 1
    Вы правильно объяснили, но ваша визуализация неверна. Для приложения поток, из которого он получает свои данные, является входным потоком.
  • 0
    @ Томас: Спасибо за ваш ответ. Это прояснило для меня разницу. Теперь я пытаюсь сделать то же самое с обычным exap-сервером apache, так как в нем sucprocess использует стандартный поток вывода (System.out). Так что мне просто сделать System.out.write (), и подпроцесс получит его во входном потоке? Я попробовал, но это не сработало
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню