【问题标题】:Java Process console output [duplicate]Java进程控制台输出[重复]
【发布时间】:2018-10-18 16:36:55
【问题描述】:

我需要有关流程输出的帮助。

我在进程控制台上工作,如果我写入进程输出,我需要关闭才能写入。如果我想发送另一个命令,我会收到“Stream closed”错误。谁能帮帮我?

来源:

public void runServer(String servername) throws InterruptedException{
    try { 
        //ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start && cmd.exe && cd \""+cm.getDataPath("server")+"\\"+servername+"\\\" && java -jar \""+cm.getDataPath("main")+"\\serverfiles\\"+getServerFile(servername)+"\"");
        ProcessBuilder builder = new ProcessBuilder("cmd", "/c", ""+cm.getDataPath("main")+"\\run.bat "+cm.getDataPath("server")+"\\"+servername+"\\ "+cm.getDataPath("main")+"\\serverfiles\\"+getServerFile(servername)+"\"");
        final Process process = builder.start(); /*Runtime.getRuntime().exec("cmd.exe /c START "+cm.getDataPath("main")+"\\run.bat "+cm.getDataPath("server")+"\\"+servername+"\\ "+cm.getDataPath("main")+"\\serverfiles\\"+getServerFile(servername)+"\"");*/
        final Thread ioThread = new Thread() {
            @Override
            public void run() {
                try {
                    writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
                    final BufferedReader reader = new BufferedReader(
                            new InputStreamReader(process.getInputStream()));
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        w.printConsole(line+"\n");
                    }
                    reader.close();
                } catch (final Exception e) {
                    e.printStackTrace();
                }
            }
        };
        ioThread.start();
        //process.waitFor();
        runningserver = process;
    } catch (IOException ex) {
        Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void sendCommand(String command){
    writer = new BufferedWriter(new OutputStreamWriter(runningserver.getOutputStream()));
    try {
        writer.append(command);
        writer.flush();
        writer.close();
    } catch (IOException ex) {
        Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

    标签: java io console streamwriter


    【解决方案1】:

    每次您调用sendCommand(...) 时,您都会关闭一个通过writer.close(); 包裹在您服务器的OutputStream 周围的BufferedWriter,这也会关闭流。不要这样做,因为这会阻止您再次使用同一流。事实上,您的 sendCommand 方法应该重用一个 writer 字段,并且您的代码应该只在完全处理完流后关闭 writer。

    【讨论】:

    • 如果不关闭,命令不会发送,也不会收到consol消息。
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2014-03-13
    • 1970-01-01
    • 2012-09-28
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多