无法理解输入流和输出流的使用

时间:2014-09-05 09:42:46

标签: java stream inputstream outputstream

我对使用输入流和输出流感到困惑。从堆栈溢出问题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() );

2 个答案:

答案 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)