Java에서 cmd 명령을 사용하는 방법: 1. 런타임에서 [exec(String command)] 메서드를 사용하여 cmd 명령을 실행합니다. 2. 먼저 실행된 cmd 명령을 파일에 쓴 다음 실행합니다. 실행 오류 로그를 인쇄할 수 있으며 스레드가 중단되지 않습니다.
【관련 학습 권장 사항: java 기본 튜토리얼】
Java에서 cmd 명령을 사용하는 방법:
1 런타임에서 exec(문자열 명령) 메서드를 사용하여 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와 방법 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!