Java Can';不理解输入流和输出流的用法

Java Can';不理解输入流和输出流的用法,java,stream,inputstream,outputstream,Java,Stream,Inputstream,Outputstream,我对输入流和输出流的使用感到困惑。从堆栈溢出问题: 标准输入-这是流程读取以从您处获取信息的文件句柄 标准输出-您的进程将正常信息写入此文件句柄 我试图用java运行一个外部进程(一个python脚本),这是一个交互式进程,需要用户的输入 现在,正如概念所说: 当流程读取以从中获取信息时,使用标准输入 你 所以我应该从进程中获取输入流来写入值。我尝试了写入,但失败了。所以我在堆栈溢出上搜索了一个问题,这个问题与从进程中获取输出流然后写入的问题相同。我尝试了,结果成功了 我的问题是为什么这样做有效

我对输入流和输出流的使用感到困惑。从堆栈溢出问题:

标准输入-这是流程读取以从您处获取信息的文件句柄

标准输出-您的进程将正常信息写入此文件句柄

我试图用java运行一个外部进程(一个python脚本),这是一个交互式进程,需要用户的输入

现在,正如概念所说:

当流程读取以从中获取信息时,使用标准输入 你

所以我应该从进程中获取输入流来写入值。我尝试了写入,但失败了。所以我在堆栈溢出上搜索了一个问题,这个问题与从进程中获取输出流然后写入的问题相同。我尝试了,结果成功了

我的问题是为什么这样做有效?它不应该是我应该用来输入外部进程的输入流吗?或者我完全错误地理解了输入流和输出流

请帮我简单地解释一下

编辑:我的代码是:

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

OutputStream
顾名思义,它用于将输出写入流(可能流到文件中,但也可能是不同类型的流)

InputStream
同样用于从流中读取输入

您可以将这些类视为同一流的两端:生产者/服务器写入输出流,消费者/客户机从输入流读取

当流程读取以从您处获取信息时,使用标准输入

这将从用户的角度描述流。对于您来说,它是一个输出流,因为您使用控制台输入数据;对于读取该数据的进程来说,它是一个输入流,因为它读取您输入到流中的数据

小型可视化:

User/Console                      Process/Application
(OutputStream) ------ data ----> (InputStream)
(InputStream)  <--- feedback --- (OutputStream)   
用户/控制台进程/应用程序
(OutputStream)----数据---->(InputStream)

(InputStream)应用程序应始终将数据写入父进程的输出流,并从父进程的输入流读取数据。对于流程,无论何时创建子流程,父流程都会将数据馈送到子流程输入流,并从子流程输出流读取数据

默认情况下,创建的子流程没有自己的终端或服务器 安慰其所有标准I/O(即标准输入、标准输出、标准输出)操作 将重定向到父进程,在那里可以访问它们 通过使用getOutputStream()方法获得的流, getInputStream()和getErrorStream()。父进程使用这些 要向子流程馈送输入并从子流程获取输出的流

返回连接到的正常输入的输出流 子流程。流的输出通过管道传输到 此进程对象表示的进程

应用程序将数据馈送到父进程输出流中,该数据将通过管道传送到子进程的输入流

public abstract InputStream getInputStream()
返回连接到的正常输出的输入流 子流程。流通过管道从的标准输出获取数据 此进程对象表示的进程

父进程从子进程的输出读取数据。应用程序从父进程输入流读取数据

在代码中:

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脚本进程输入流中,并可供脚本阅读。

您的解释是正确的,但您的可视化是错误的。对于应用程序,它从中获取数据的流是一个inputstream。@托马斯:谢谢你的回复。它为我消除了差异。现在我正在尝试对apache common exec执行相同的操作,因为在它中,sucprocess使用标准输出流(System.out)。所以我应该只执行System.out.write(),而子进程将在它的输入流中获取它吗?我试过了,但没有成功work@AbhijeetPanwar这取决于进程将从哪个输入流中读取。进程不一定要从stdin读取数据。应用程序应该总是从父进程的输入流读取数据。那么为什么我需要使用进程的输出流将数据传递给python脚本?因为要将数据传递给子进程,需要将数据写入子进程输入流。因此,您需要写入父进程outputstream,它将通过管道传输到子进程的输入流。我猜在这里,您的python脚本执行将是子过程。我已经编辑了问题,并添加了相应的代码,请你检查一下并简要解释一下。这将非常有帮助。更新的答案与你的评论非常吻合。我很清楚这个概念。我开始这个问题是因为我对输入流和输出流的使用感到困惑。我接受了这个概念,但仍然无法解决这个问题。我正在使用apache commons exec,其中父进程使用satandard输出作为输出。我无法在那里应用它。请看:
Process process=Runtime.getRuntime().exec("/usr/bin/python /home/abhijeet/test.py");
OutputStream  stdin = process.getOutputStream ();
String line = "30" + "\n";
stdin.write(line.getBytes() );