天天看點

Java如何調用外部指令?

Java如何調用外部外部指令?

我自己的體會是用Runtime.getRuntime.exec(cmd);

譬如下面這個代碼:

String[] cmd = new String[3];

if( osName.equals( "Windows NT" )||osName.equals( "Windows 2000" ))

    {

     cmd[0] = "cmd.exe" ;

     cmd[1] = "/C" ;

    }

else if(osName.equals("Linux"))

   {

     cmd[0]="sh"

      cmd[1]=linux下的某個目錄

   }

    else if( osName.equals( "Windows 98" ) )

    {

     cmd[0] = "command.com" ;

     cmd[1] = "/C" ;

    }

    cmd[2] = "mysqldump --opt -u root yh_tpl > "+backup_path+filename+".sql";

    Process ps = Runtime.getRuntime().exec(cmd); 

今天看到了别人回複這類問題,有這樣一點以前不知道:

java中調用exec完全脫離了java的jvm,是以以後的運作環境需要自己維護。

======================================================================================================

 Java調用外部程式的方法

作者:陳剛,桂林人,97年畢業于廣西師範大學數學系,暫于IBM中國研究中心兼職從事軟體開發(2004.2-?),專注基于java平台的軟體開發。

email: [email protected]

blog: glchengang.yeah.net

最近開發報表子產品,生成報表檔案後(一個Excel檔案)要将此檔案打。很簡單,使用Java調用外部程式的方法即可。代碼如下:

String path = "C:/報表_20040504.xls";

try {

  //相當于window的"開始"->"運作"的效果

Runtime.getRuntime().exec("cmd /c start " + path);

} catch (IOException e) {

e.printStackTrace();

}

但如果檔案的路徑中包含有空格上面的方法就會出錯。到google狂搜一氣,沒有,看cmd /?幫助也沒有,試了好多次,發現解決辦法其實很簡單,真是愚昧。代碼如下,無須多言。

String path = "C:/Documents and Settings/Giles/桌面/報表_20040504.xls";

try {

Runtime.getRuntime().exec("cmd /c start excel /"" + path + "/"");

} catch (IOException e) {

e.printStackTrace();

}

======================================================================================================

Java如何調用外部指令?

<script language=Javascript1.2 src="../scripts/watermark.js"></script>

Execute an external program

This example will

capture

the output (from stdio) of an external program.

import java.io.*;
public class CmdExec {
  public CmdExec(String cmdline) {
    try {
     String line;
     Process p = Runtime.getRuntime().exec(cmdline);
     BufferedReader input = 
       new BufferedReader
         (new InputStreamReader(p.getInputStream()));
     while ((line = input.readLine()) != null) {
       System.out.println(line);
       }
     input.close();
     } 
    catch (Exception err) {
     err.printStackTrace();
     }
   }

public static void main(String argv[]) {
  new CmdExec("myprog.bat");
  }
}
      
[myprog.bat]
echo hello world!
      

NOTE 1: Reading a BAT file output containing the dir command may hang. I don't know why...

NOTE 2: To make a shortcut : Create a shortcut to CmdExec.class. Go in the shortcut properties and change the

target

as "java CmdExec". Change the

run

option to Minimized to hide the black DOS console when the BAT is executed.

NOTE 3 : A useful link on the subject : JavaWorld article, thanks to O. Thomann.

The following example

start a Dial-up connection

on the Win plateform :

[Dialup.java]
public class Dialup {
   public static void main(String[] args) throws Exception {
     Process p = Runtime.getRuntime().exec("dialup.bat");
     p.waitFor();
     System.out.println("Done.");
     }
   }      

The BAT file contains the DOS call to bring the Dialog. The "MyConnection" is the DUN and it's case sensitive.

[dialup.bat]
rundll32.exe rnaui.dll,RnaDial MyConnection
      

You still need to press ENTER to CONNECT, there is an option in the Connection properties to connect automatically.

If you want to wait until the BAT file is finished, use "start /wait".

[dialup.bat]
start /wait rundll32.exe rnaui.dll,RnaDial MyConnection
      

On NT and W2K, rnaui.dll is not available. Use rasdial.exe instead.

rasdial "connection name"
rasdial "connection name" /d to drop
rasdial /? for more options
      

To launch a

Unix script
String[] cmd = {"/bin/sh", "-c", "ls > hello"};
Runtime.getRuntime().exec(cmd);
      

You can include a path for the program to be executed. On the Win plateform, you need to put the path in quotes if

the path contains spaces

in it.

public class Test {
   public static void main(String[] args) throws Exception {
     Process p = Runtime.getRuntime().exec(
       "/"c:/program files/windows/notepad.exe/"");
        p.waitFor();
     }
  }      

If you need to

pass arguments

, it's safer to a String array especially if they contain spaces.

String[] cmd = { "myProgram.exe", "-o=This is an option" };
Runtime.getRuntime().exec(cmd);
      
PDF (Windows only)
[ShowPDF.java]
public class ShowPDF {
   public static void main(String[] args) throws Exception {
     Process p = Runtime.getRuntime().exec("showpdf.bat mypdf.pdf");
     p.waitFor();
     System.out.println("Done.");
     }
   }

[showpdf.bat]
rundll32 url.dll,FileProtocolHandler %1      
VBSCRIPT
// Win9x
Runtime.getRuntime().exec("start myscript.vbs");

// WinNT
Runtime.getRuntime().exec("cmd /c start myscript.vbs");
      
HTML Help (Windows only)
Runtime.getRuntime().exec("hh.exe myhelpfile.chm");
      
Any program using the Windows file association mechanism

where "file" is the filename of the data file ex. myresume.doc to start Word if the doc extension is associated with it.

Runtime.getRuntime().exec
  ("rundll32 SHELL32.DLL,ShellExec_RunDLL " + file.getAbsolutePath());