2011-12-19 76 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并且看看困难的教训,简单的方法......“