亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

CMD (Java) 中的 Postgres Restore 不再響應,而相同的命令在 CMD

CMD (Java) 中的 Postgres Restore 不再響應,而相同的命令在 CMD

慕婉清6462132 2023-05-10 15:43:38
我已經為 Windows 操作系統任務調度程序編寫了一些代碼,以自動獲取備份并將其在本地恢復到我的 postgres 數據庫。所有的東西都在工作,直到最后一步,恢復命令。雖然直接在 cmd shell 中執行的同一命令運行良好。我想我沒有捕捉到恢復的結束,這是警告....有人知道為什么沒有執行和完成 cmd 腳本嗎?我應該使用另一種方法,關閉連接嗎?這是我的代碼                    // 7 restore database                    ProcessBuilder processBuilder21 = new ProcessBuilder();                    // Windows                    String cmd1 = "pg_restore -h localhost -p " + postgresPort + " -U " + postgresUsername + " -d "                            + postgresDbname + " " + dbLocation;                    processBuilder21.command("cmd.exe", "/c", cmd1);                    System.out.println(cmd1);                    try {                        Process process = processBuilder21.start();                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));                        String line;                        while ((line = reader.readLine()) != null) {                            System.out.println(cmd1);                        }                        int exitCode = process.waitFor();                        System.out.println("Exitcode: "+ exitCode);                        if (exitCode == 0) {                            System.out.println("Database restored: " + postgresDbname);                        } else {                            System.out.println("Error database restore");                        }                        System.out.println(cmd1);                    } catch (IOException e) {                        e.printStackTrace();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }
查看完整描述

1 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

您沒有讀取命令錯誤輸出,因此如果生成大量錯誤輸出,錯誤流緩沖區將滿載并阻止命令。

調用processBuilder21.redirectErrorStream(true)以將命令錯誤輸出合并到標準輸出中。

其他變化:

  • 您可以組合語句。

  • 您需要關閉流,最好使用 try-with-resources。

  • 您可能希望將循環內的語句更改while為 print?line,而不是cmd1。

Process process = new ProcessBuilder("cmd.exe", "/c", cmd1)

? ? ? ? .redirectErrorStream(true)

? ? ? ? .start();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {

? ? for (String line; (line = reader.readLine()) != null; ) {

? ? ? ? System.out.println(line);

? ? }

}

int exitCode = process.waitFor();

當然,由于您只是打印輸出,您也可以通過調用inheritIO().


int exitCode = new ProcessBuilder("cmd.exe", "/c", cmd1)

? ? ? ? .inheritIO()

? ? ? ? .start()

? ? ? ? .waitFor();


查看完整回答
反對 回復 2023-05-10
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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