第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從另一個 JVM 讀取一個 JVM 的輸入流

從另一個 JVM 讀取一個 JVM 的輸入流

泛舟湖上清波郎朗 2022-06-08 17:30:06
目標:使用 ProcessBuilder 從單獨的 JVM(1) 初始化 JVM(2),從 JVM(2) 捕獲結果輸出并在 JVM(1) 的 JTextArea 中顯示結果。情況:能夠從 JVM(1) 內啟動 JVM(2) 并將 JVM(2) 的結果輸出捕獲到 JVM(1) 內的 JTextArea。問題:在 JVM(1) 終止之前,JVM(2) 不會響應輸入。啟動 JVM(2) 的 VJM(1) 內的線程: Runnable runnable = () -> {      try {         JVMBooter.startSecondJVM();     } catch (Exception ex) {        Logger.getLogger(MyMenu.class.getName()).log(Level.SEVERE, null, ex);     } }; Thread t = new Thread(runnable); t.start();JVMBooter 源代碼:import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;public class JVMBooter {    public static void startSecondJVM() throws Exception {        ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "startscript.bat");        File dir = new File("D:/Server");        pb.directory(dir);        Process p = pb.start();        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));        String line = null;        ( (line = reader.readLine()) != null && ! line.trim().equals("--EOF--")) {            OutputFrame.textArea.append(line + "\n");        }    }}JVM(2) 在 startscript.bat 文件中啟動:java -jar server.jar
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

根據情況,可能需要讀取錯誤流而不是輸入流,例如,如果您的第二個 java 調用是-version或您調用的程序僅寫入 stderr 而不是 stdout 獲取錯誤流是正確的方法。


我寫了這個 MCVE:


import java.io.*;


public class Starter {

    public static void main(String[] args) throws IOException {

        ProcessBuilder pb = new ProcessBuilder("./dosomething.sh");

        File dir = new File(new File(File.listRoots()[0], "tmp"), "2jvm");

        pb.directory(dir);

        Process p = pb.start();


        BufferedReader read = new BufferedReader(new InputStreamReader(p.getErrorStream()));

        String line;

        while ( (line = read.readLine() ) != null) {

            System.out.println("line: " + line);

        }

    }

}

在“dosomething.sh”中:


echo before

java -version

echo after

當我使用時,p.getInputStream我會得到“之前”和“之后”。當我使用時,p.getErrorStream我會得到 Java 版本信息。這對你來說也可能是真的。我建議您echo在批處理文件中添加行以查看它們是否被打印出來。


我還寫了一個簡單的 hello world,當我從中調用它時,dosomething.sh它會按預期打印到輸入流中。寫入標準錯誤是一個奇怪的怪癖。-version


為了完整起見,這里是我使用的 Hello World(它等待模擬長時間運行的服務器進程):


public class Caller {

  public static void main(String[] args) {

    synchronized(Caller.class) {

      for(int ii = 0; ii < 10; ii++) {

        try {

          Caller.class.wait(1000);

        } catch (Exception ex) {

          ex.printStackTrace();

        }

        System.out.println("Hello world! " + ii);

      }

    }

  }

}


查看完整回答
反對 回復 2022-06-08
  • 1 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號