2011-12-19 79 views
0

我正在Java中執行Nmap,將網絡信息保存到文件中。代碼如下所示:Java,通過Nmap寫入文件在大型網絡上死機

Process p = Runtime.getRuntime().exec(new String[] {"nmap", "-O", "-oX", nmapFileLocation, ipStr+"/24"}); 

BufferedReader in = new BufferedReader( new InputStreamReader(p.getInputStream())); 
String line = null; while ((line = in.readLine()) != null) {} 
p.waitFor(); 

OutputStream os = p.getOutputStream(); os.flush(); 
os = p.getOutputStream(); os.flush(); 

看來我必須通過所有的線來讀得到它的工作(我指的是while循環);這適用於較小的網絡。我嘗試了幾種方式讓它在大型網絡上運行,但似乎掛起了。

例如,我正在運行執行nMap的Java應用程序。它已運行了半個小時,並掛在nmap代碼行的位置。我觀察過很多次,如果我打開它創建的文件,而Java應用程序正在運行,我只能看到新創建的文件中的前12行。但是,只要關閉Java應用程序,就可以看到所有〜1600行的文件。我願意嘗試不同的方法。

+0

看看ProcessBuilder類。也許你忘了關閉某處的流。是不是也有你應該處理的ErrorStream? – HectorLector 2011-12-20 00:07:49

+1

HectorLector是正確的。您還需要使用錯誤流。 [「調用Runtime.exec時捕獲stdout」](http://stackoverflow.com/questions/882772/capturing-stdout-when-calling-runtime-exec)的答案可能會幫助你。 – creemama 2011-12-20 00:39:17

回答

0

約翰,

嘗試apache commons-exec

一旦它對我有幫助,可能對你有幫助。

這是(從他們的網站):
從Java執行外部進程是一個衆所周知的問題領域。它依賴於平臺,並且需要開發人員瞭解和測試特定於平臺的行爲,例如,在Windows上使用cmd.exe或導致死鎖的有限緩衝區大小。

「你看看下議院Exec和認爲‘哇 - 調用的Runtime.exec()是很容易和Apache人是在浪費我的時間噸的代碼’ 好了,我們學到了艱辛的道路(在我的案例中不止一次),使用普通的Runtime.exec()會是一個痛苦的經歷,因此你被邀請深入研究commons-exec並且看看困難的教訓,簡單的方法......「