我对使用输入流和输出流感到困惑。从堆栈溢出问题confused about stdin, stdout and stderr?:
标准输入 - 这是您的流程从中获取信息的文件句柄。
标准输出 - 您的进程会将正常信息写入此文件句柄。
我试图使用java运行外部进程(一个python脚本).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() );
答案 0 :(得分:2)
应用程序应始终将数据写入父进程的输出流,并从父进程的输入流中读取。对于进程,无论何时创建子进程,父进程都将数据提供给子进程输入流,并从子进程输出流中读取。
默认情况下,创建的子进程没有自己的终端或 安慰。所有标准I / O(即stdin,stdout,stderr)操作 将被重定向到父进程,在那里可以访问它们 通过使用方法getOutputStream()获得的流, getInputStream()和getErrorStream()。父进程使用这些 stream将输入提供给子进程并从子进程输出。
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脚本进程输入流,并可供脚本读取。
答案 1 :(得分:1)
OutputStream
用于将输出写入流(可能会流式传输到文件中,但也可能是不同类型的流)。
InputStream
同样用于从流中读取输入。
您可以将这些类视为同一个流的两端:生产者/服务器写入输出流,消费者/客户端从输入流中读取。
当您的流程读取以获取您的信息时,将使用标准输入。
这将从用户的角度描述流。对于您来说,它是一个输出流,因为您使用控制台输入数据,对于读取该数据的进程,它是一个输入流,因为它读取您在流中输入的数据。
小的可视化:
User/Console Process/Application
(OutputStream) ------ data ----> (InputStream)
(InputStream) <--- feedback --- (OutputStream)