当前位置: 首页 > 面试题库 >

在Java中重定向stdin和stdout

祁修平
2023-03-14
问题内容

我试图重定向java中子进程的stdin和stdout,最终我将把输出转到JTextArea或其他东西。

这是我当前的代码,

Process cmd = Runtime.getRuntime().exec("cmd.exe");

cmd.getOutputStream().write("echo Hello World".getBytes());
cmd.getOutputStream().flush();

byte[] buffer = new byte[1024];
cmd.getInputStream().read(buffer);
String s = new String(buffer);

System.out.println(s);

输出如下所示:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\(Current Directory)>

我期望看到输出“ Hello World”字符串。也许是因为父进程的存活时间不够长?

我还希望能够发送和接收多个命令。


问题答案:

在尝试侦听输入流之前,您已经尝试写入输出流,因此您什么也没看到是有道理的。为使此成功,您将需要对两个流使用单独的线程

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Foo {
   public static void main(String[] args) throws IOException {
      Process cmd = Runtime.getRuntime().exec("cmd.exe");

      final InputStream inStream = cmd.getInputStream();
      new Thread(new Runnable() {
         public void run() {
            InputStreamReader reader = new InputStreamReader(inStream);
            Scanner scan = new Scanner(reader);
            while (scan.hasNextLine()) {
               System.out.println(scan.nextLine());
            }
         }
      }).start();

      OutputStream outStream = cmd.getOutputStream();
      PrintWriter pWriter = new PrintWriter(outStream);
      pWriter.println("echo Hello World");
      pWriter.flush();
      pWriter.close();
   }
}

而且,您实际上也不应该忽略错误流,而应该吞噬错误流,因为忽略错误流有时会耗尽您的进程,因为它可能会耗尽缓冲区空间。



 类似资料:
  • 问题内容: 我从一个需要标准输入重定向的Python项目开始,使用类似于以下的代码: 问题是,代码运行后,将显示以下内容: 输入内容:您输入的内容:Hello 有没有办法修改我的代码,以便显示以下内容? 输入内容:您好 您输入了:您好 我一直在搜寻高低,但尚未找到答案。如果有人有主意,我将不胜感激。谢谢! 问题答案: 我不确定为什么需要这样做,但是您可以始终这样做: 再说一次,根据需要交换自己的实

  • 问题内容: 我正在尝试从Java程序运行外部程序,但遇到了麻烦。基本上我想做的是这样的: 但是,我发现这是行不通的-Java清单需要使用带有输入和输出流以及其他我没有经验的东西。 我看了互联网上的许多示例(其中许多来自SO),并且似乎没有一种简单的标准方法来完成此操作,对于不完全了解正在发生的事情的人来说,可能非常令人沮丧。 我也很难在其他人的代码示例上构建自己的代码,因为通常看来,大多数其他人1

  • 在 Linux 中,一切都只是文件。这意味着,对于控制台程序: 键盘表示为一个文件,Bash 从中读取你的输入。 显示器表示为一个文件,Bash向输出写入它。 让我们假设,你有一个程序可以计算文件中的行。你可以通过键入wc -l来调用它。现在尝试一下 没有发生什么事吧?它只是卡在那里。错了,它正在等待你的输入。这是它的工作原理: line_counter = 0 while end of file

  • 问题内容: 考虑以下 示例 脚本: 重定向作为文件描述符3的输入的目的是什么?至少在中,如果省略,似乎没有什么区别。如果在非shell中执行它,是否有效果? 更新 对于那些想知道它来自哪里的人,它是Debian 脚本的简化示例。 问题答案: 此处的明确意图是通过确保其stdin来自其他位置来防止从流中读取。 如果没有看到重定向或不重定向的行为差异,那是因为在测试中实际上没有从stdin读取数据。

  • 我有2个问题 1)我有一个login.jsp页和索引页。一旦我验证了用户(在servlet ie中),用户将被重定向到index.jsp页面。我用servlet的这条线重定向它 这个过程运行良好。但是当我刷新页面时,我会被重定向回登录页面。另外,我注意到在index.jsp页面上,我得到的名字而不是index.jsp,即我的servlet名称得到displayed.for这样的例子得到代替显示 2

  • 问题内容: 我正在使用Eclipse开发Java程序,并且想在没有参数的情况下为我的程序添加一个选项以解析stdin。(否则它将解析一个文件) 如果执行并去调试,我会遇到问题…然后意识到我不知道如何像这样在Eclipse中启动进程。而且,如果我在命令提示符下运行它,则该进程会立即启动,因此无法附加到正在运行的进程。 关于如何调试的任何建议? 编辑 :看到的是,我最初编写程序是为了接受文件名参数。然