Java で cmd コマンドを使用する方法: 1. ランタイムで [exec(String command)] メソッドを使用して cmd コマンドを実行します; 2. まず、実行した cmd コマンドをファイルに書き込んでから実行します. これは、実行エラーログが出力できれば、スレッドがスタックすることはありません。
[関連する学習の推奨事項: java 基本チュートリアル]
Java で cmd コマンドを使用する方法:
1. 次のように、ランタイムで exec(String command) メソッドを使用して cmd コマンドを実行します:
Process p = Runtime.getRuntime().exec(cmd);
このメソッドは IOException をスローしますが、例外は発生しません。プロジェクト内で注文は実行されませんでした。
2. このメソッドは、ほとんどの cmd 呼び出しで期待される結果を達成できますが、コマンドが p.waitFor(); でスタックし、スレッドがブロックされることがあります
public static boolean runCMD(String cmd) throws IOException, InterruptedException { final String METHOD_NAME = "runCMD"; Process p = Runtime.getRuntime().exec(cmd); BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(p.getErrorStream())); String readLine = br.readLine(); StringBuilder builder = new StringBuilder(); while (readLine != null) { readLine = br.readLine(); builder.append(readLine); } logger.debug(METHOD_NAME + "#readLine: " + builder.toString()); p.waitFor(); int i = p.exitValue(); logger.info(METHOD_NAME + "#exitValue = " + i); if (i == 0) { return true; } else { return false; } } catch (IOException e) { logger.error(METHOD_NAME + "#ErrMsg=" + e.getMessage()); e.printStackTrace(); throw e; } finally { if (br != null) { br.close(); } } }
3。次の方法では、2 と同じ状況でブロッキングの問題が発生しません。2 との違いは、ストリームを取得することです。getErrorStream を getInputStream に置き換えるだけです。
public static boolean runCMD(String cmd) throws IOException, InterruptedException { final String METHOD_NAME = "runCMD"; // Process p = Runtime.getRuntime().exec("cmd.exe /C " + cmd); Process p = Runtime.getRuntime().exec(cmd); BufferedReader br = null; try { // br = new BufferedReader(new InputStreamReader(p.getErrorStream())); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String readLine = br.readLine(); StringBuilder builder = new StringBuilder(); while (readLine != null) { readLine = br.readLine(); builder.append(readLine); } logger.debug(METHOD_NAME + "#readLine: " + builder.toString()); p.waitFor(); int i = p.exitValue(); logger.info(METHOD_NAME + "#exitValue = " + i); if (i == 0) { return true; } else { return false; } } catch (IOException e) { logger.error(METHOD_NAME + "#ErrMsg=" + e.getMessage()); e.printStackTrace(); throw e; } finally { if (br != null) { br.close(); } } }
4. 方法 3 の欠点の 1 つは、実行エラーです。エラー メッセージは出力できません。別の方法は、実行した cmd コマンドを実行する前にファイルに書き込むことです。実行エラー ログを出力できれば、スレッドがスタックすることはありません。
a. 実行名をファイルに書き込みます。 FileUtils.java
public static boolean writeFile(File exportFile, final String content) { if (exportFile == null || StringUtils.isEmpty(content)) { return false; } if (!exportFile.exists()) { try { exportFile.getParentFile().mkdirs(); exportFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); logger.error("create local json file exception: " + e.getMessage()); return false; } } BufferedWriter bufferedWriter = null; try { FileOutputStream os = new FileOutputStream(exportFile); FileDescriptor fd = os.getFD(); bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); bufferedWriter.write(content); //Flush the data from the streams and writes into system buffers //The data may or may not be written to disk. bufferedWriter.flush(); //block until the system buffers have been written to disk. //After this method returns, the data is guaranteed to have //been written to disk. fd.sync(); } catch (UnsupportedEncodingException e) { logger.error("saveDBData#catch an UnsupportedEncodingException (" + e.getMessage() + ")"); return false; } catch (FileNotFoundException e) { logger.error("saveDBData#catch an FileNotFoundException (" + e.getMessage() + ")"); return false; } catch (IOException e) { logger.error("saveDBData#catch an IOException (" + e.getMessage() + ")"); return false; } catch (Exception e) { logger.error("saveDBData#catch an exception (" + e.getMessage() + ")"); return false; } finally { try { if (bufferedWriter != null) { bufferedWriter.close(); bufferedWriter = null; } } catch (IOException e) { logger.error("writeJsonToFile#catch an exception (" + e.getMessage() + ")"); } } return true; }
b. コマンドを実行します
public static boolean excuteCMDBatFile(String cmd) { final String METHOD_NAME = "excuteCMDBatFile#"; boolean result = true; Process p; File batFile = new File("D:/test/cmd.bat"); System.out.println(batFile.getAbsolutePath()); boolean isSuccess = FileUtils.writeFile(batFile, cmd); if(!isSuccess) { logger.error(METHOD_NAME + "write cmd to File failed."); return false; } String batFilePath = "\"" + MigrateContants.CMD_BAT_FILE + "\""; logger.info("cmd path:" + batFilePath); try { p = Runtime.getRuntime().exec(batFilePath); InputStream fis = p.getErrorStream();//p.getInputStream(); InputStreamReader isr = new InputStreamReader(fis, System.getProperty("file.encoding")); BufferedReader br = new BufferedReader(isr); String line = null; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); } p.waitFor(); int i = p.exitValue(); logger.info(METHOD_NAME + "exitValue = " + i); if (i != 0) { result = false; logger.error(METHOD_NAME + "excute cmd failed, [result = " + result + ", error message = " + builder.toString() + "]"); System.out.println(METHOD_NAME + "excute cmd failed, [result = " + result + ", error message = " + builder.toString() + "]"); }else { // logger.debug(METHOD_NAME + "excute cmd result = " + result); System.out.println(METHOD_NAME + "result = " + result); } } catch (Exception e) { result = false; e.printStackTrace(); logger.error(METHOD_NAME + "fail to excute bat File [ErrMsg=" + e.getMessage() + "]"); } return result; }
関連学習の推奨事項:プログラミング ビデオ
以上がJavaでcmdコマンドを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。