Java,通过Nmap写入文件在大型网络上冻结

Java,通过Nmap写入文件在大型网络上冻结,java,file-io,Java,File Io,我正在用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

我正在用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行文件都是可见的。我愿意尝试不同的方法。

约翰

试试看

一旦它帮助了我,也许会帮助你

以下是原因(从他们的网站):
从Java执行外部进程是一个众所周知的问题领域。它依赖于平台,需要开发人员了解并测试特定于平台的行为,例如在Windows上使用cmd.exe或有限的缓冲区大小导致死锁

当你看到Commons Exec时,你会想“哇,调用Runtime.Exec()很简单,Apache的人在浪费他们和我的时间编写大量的代码”。
好的,我们通过艰难的方式(在我的例子中不止一次)了解到,使用普通运行时.exec()可能是一种痛苦的体验。因此,我们邀请您深入研究commons exec,并以简单的方式了解其中的艰难经验……

了解ProcessBuilder类。也许你忘了在某个地方关闭一条小溪。你不也应该处理错误流吗?HectorLector是对的。您还需要使用错误流。这个问题的答案可能对你有所帮助。