2015-10-30 81 views
-1

我試圖在Mac上運行Java上的「tar」命令。我注意到這個命令被卡住了。基本上,文件大小不會增長,命令也不會返回。但是,如果我運行較小的directiry,它工作正常。使用Java的Mac(Unix)上運行命令 - 卡住

這裏是我的代碼:

try 
     { 
      Runtime rt = Runtime.getRuntime(); 

      Process process = new ProcessBuilder(new String[]{"tar","-cvzf",compressFileName+" "+all_dirs}).start(); 

      InputStream stdin2 = process.getInputStream(); 
      InputStreamReader isr2 = new InputStreamReader(stdin2); 
      BufferedReader br2 = new BufferedReader(isr2); 
      String line2 = null; 
      System.out.println("<OUTPUT>"); 
      while ((line2 = br2.readLine()) != null) 
       System.out.println(line2); 
      System.out.println("</OUTPUT>"); 
      int exitVal3 = process.waitFor(); 
      System.out.println("Process exitValue .....: " + exitVal3); 
     } catch (Throwable t) 
      { 
      t.printStackTrace(); 
      } 

我也試過:

String tile_command="tar -cvzf file.tar.gz dire_to_compress "; 
     String[] tile_command_arr= new String[]{"bash","-c",tile_command}; 

try 
     { 
      Runtime rt = Runtime.getRuntime(); 

      Process proc2 = rt.exec(tile_command_arr); 
      InputStream stdin2 = process.getInputStream(); 
      InputStreamReader isr2 = new InputStreamReader(stdin2); 
      BufferedReader br2 = new BufferedReader(isr2); 
      String line2 = null; 
      System.out.println("<OUTPUT>"); 
      while ((line2 = br2.readLine()) != null) 
       System.out.println(line2); 
      System.out.println("</OUTPUT>"); 
      int exitVal3 = process.waitFor(); 
      System.out.println("Process exitValue for tiling .....: " + exitVal3); 
     } catch (Throwable t) 
      { 
      t.printStackTrace(); 
      } 
+0

目錄有多大?您的JVM僅限於多少內存? – alfasin

+0

對於任何目錄,這看起來好像根本不應該工作。你確定你獲得了*任何*輸入的零退出值嗎? – RealSkeptic

+0

目錄大小爲10GB ...我運行Java時未指定內存參數 – user836026

回答

2
ProcessBuilder(new String[]{"tar","-cvzf",compressFileName+" "+all_dirs}) 

問題就更爲突出。

使用ProcessBuilder不能將兩個參數與空間放在一起,並期望底層進程獲得兩個參數。它會得到一個,就像你運行該命令

tar -cvzf 'compressFileName all_dirs' 

這將有焦油奇怪,爲什麼你有一個非常時髦的文件名創建compressFileName(space)all_dirs,和你在哪裏希望把它的內容是什麼?

你需要的東西更接近

String[]{"tar", "-cvzf", compressFileName, all_dirs}; 

,或者如果all_dirs是多個目錄,你需要將它們同時添加到字符串數組一個(使用字符串的ArrayList,然後拉動陣列在ArrayList之外)。

+0

順便說一句,你不需要說「new String [] {...}」:只需將每個字符串作爲單獨的參數傳遞,因爲構造函數需要可變參數。 –