java如何用cmd指令的方法:1、使用Runtime中【exec(String command)】方法執行cmd指令;2、先將執行的cmd指令寫入檔案後再執行,這是如果執行錯誤日誌可以列印,則執行緒也不會卡死。
【相關學習推薦:java基礎教學】
java如何用cmd指令的方法:
1.使用Runtime中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方法有個缺點是執行錯誤時無法將錯誤訊息列印出來,還有一個方法是先將執行的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中文網其他相關文章!