java - 编写标准输入并等待标准输出

标签 java process input standards

我正在尝试创建一个让 netsh windows 命令行工具保持打开状态的线程,这样我就可以执行 netsh 命令而无需每次都打开它。

问题是,一旦我创建了线程,只有第一个命令调用起作用...后续调用似乎没有任何效果。

这是我的代码:

public class NetshThread implements Runnable{
 private static Process netshProcess = null;
 private static BufferedInputStream netshInStream = null;
 private static BufferedOutputStream netshOutStream = null;
 public BufferedReader inPipe = null;

 public void run(){
  startNetsh();
 }

 public void startNetsh(){
  try {
   netshProcess = Runtime.getRuntime().exec("netsh");
   netshInStream = new BufferedInputStream(netshProcess.getInputStream());
   netshOutStream =  new BufferedOutputStream(netshProcess.getOutputStream());
   inPipe = new BufferedReader(new InputStreamReader(netshInStream));
  } catch (IOException e) {
   e.printStackTrace();
  }
 } 

 public void executeCommand(String command){
  System.out.println("Executing: " + command);
  try {
   String str = "";
   netshOutStream.write(command.getBytes());
   netshOutStream.close();
   while ((str = inPipe.readLine()) != null) {
                System.out.println(str);
            }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void closeNetsh(){
  executeCommand("exit");
 }

 public static void main(String[] args){
  NetshThread nthread = new NetshThread();
  nthread.run();
  String command = "int ip set address " +
    "\"Local Area Connection 6\" static .69.69.69 255.255.255.0";
  nthread.executeCommand(command);
  command = "int ip set address " +
    "\"Local Area Connection 6\" static 69.69.69.69 255.255.255.0";
  nthread.executeCommand(command);
  System.out.println("*** DONE ***");
 }
}

谢谢!!! =)

更新 1:

好的...我现在改用 PrintWriter...所以我认为我不需要再刷新任何东西,因为构造函数是:

新的 PrintWriter(netshOutStream, true); (就像 Shiny 先生告诉我的那样)...

假设我决定在第一个输出行可用时中断 while 循环...我也不工作...不会执行下一个命令...我的代码现在看起来像:

import java.io.*;

public class NetshThread implements Runnable{
    private static Process netshProcess = null;
    private static BufferedInputStream netshInStream = null;
    private static BufferedOutputStream netshOutStream = null;
    public BufferedReader inPipe = null;
    private PrintWriter netshWriter = null;

    public void run(){
        startNetsh();       
    }

    public void startNetsh(){
        try {
            netshProcess = Runtime.getRuntime().exec("netsh");
            netshInStream = new BufferedInputStream(netshProcess.getInputStream());
            netshOutStream =  new BufferedOutputStream(netshProcess.getOutputStream());
            netshWriter = new PrintWriter(netshOutStream, true);
            inPipe = new BufferedReader(new InputStreamReader(netshInStream));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 

    public void executeCommand(String command){
        System.out.println("Executing: " + command);
        try {
            String str = "";
            netshWriter.println(command);
            while ((str = inPipe.readLine()) != null) {
                System.out.println(str);
                break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void closeNetsh(){
        executeCommand("exit");
    }

    public static void main(String[] args){     
        NetshThread nthread = new NetshThread();
        Thread xs = new Thread(nthread);
        xs.run();
        String command = "int ip set address " +
                "\"Local Area Connection 6\" static .69.69.69 255.255.255.0";
        nthread.executeCommand(command);
        command = "int ip set address " +
                "\"Local Area Connection 6\" static 69.69.69.69 255.255.255.0";
        nthread.executeCommand(command);
        System.out.println("*** DONE ***");
    }
}

我得到的输出:

Executing: int ip set address "Local Area Connection 6" static .69.69.69 255.255.255.0 netsh>.69.69.69 is not an acceptable value for addr. Executing: int ip set address "Local Area Connection 6" static 69.69.69.69

为什么第二个命令没有执行???

255.255.255.0

* DONE *

更新 2:

在一位老师在西类牙语 Windows 环境中试用我的应用程序之前,一切似乎都运行良好....

我的代码是这样的:

扫描器 fi = new Scanner(netshProcess.getInputStream());

public void executeCommand(String command) {
        System.out.println("Executing: " + command);
        String str = "";
        netshWriter.println(command);
        fi.skip("\\s*");
        str = fi.nextLine();
        System.out.println(str);
}

我需要的是以某种方式将 netshWriter 编码设置为 Windows 默认值。

有人知道该由谁来做吗?

最佳答案

您正在关闭输出流。

关于java - 编写标准输入并等待标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638312/

相关文章:

Java运行时进程waitfor并没有出现等待

java - 正则表达式解析命令行选项

java - Google Calendars API - setTimeMax 导致错误

java - 运行打包在jar文件中的exe

python - 万无一失的跨平台进程kill daemon

html - 如何阻止 Chrome 预填充输入框?

java - JUnit 中的assertEquals(Object[], Object[]) ?

java - 我想从 java 程序运行 pict.exe

javascript - 不允许在文本输入中键入或粘贴空格,并保持文本和插入符号位置相同

html - 使输入类型为 ="Password"在移动设备上使用数字键盘