Java Runtime.getRuntime().exec()调用数百次后失败

Java Runtime.getRuntime().exec()调用数百次后失败,java,android,exec,runtime.exec,Java,Android,Exec,Runtime.exec,我有一个执行 Runtime.getRuntime().exec(“ls-l”); 多次,系统中的每个目录一次 我的测试系统有1000多个目录和Runtime.getRuntime().exec(“ls-l”);似乎在480个目录后出错。 我收到的错误消息是“运行exec()时出错。命令:[ls,-l]工作目录:null环境:null”。 我猜它正在耗尽一些必需的系统资源,或者是吗? 有没有办法处理所有目录而不出错 回答中的相关评论: 我应该澄清一下,我使用的是Android SDK的adb.e

我有一个执行 Runtime.getRuntime().exec(“ls-l”); 多次,系统中的每个目录一次

我的测试系统有1000多个目录和Runtime.getRuntime().exec(“ls-l”);似乎在480个目录后出错。 我收到的错误消息是“运行exec()时出错。命令:[ls,-l]工作目录:null环境:null”。 我猜它正在耗尽一些必需的系统资源,或者是吗? 有没有办法处理所有目录而不出错

回答中的相关评论:


我应该澄清一下,我使用的是Android SDK的adb.exe。我想 执行类似Runtime.getRuntime().exec(“adb shell ls-l”)的命令 在不同的目录上多次


使用
Runtime.getRuntime().exec
时,应显式关闭输入/输出流

Process p = null;
try {
    p = Runtime.getRuntime().exec("ls -l");
    //process output here
    p.waitFor();
} finally {
    if (p != null) {
        p.getOutputStream().close();
        p.getInputStream().close();
        p.getErrorStream().close(); 
    }
}
最好在这些类上使用适当的方法来遍历和操作文件系统

你不会说你为什么这样做,但这里有一个例子

我有一个执行Runtime.getRuntime().exec(“ls”)的Java程序 -l”);多次,系统中的每个目录一次

为什么??
File.listFiles()
有问题吗


您甚至不需要执行一次“ls”。

它是在某个特定目录上失败,还是每次都是随机目录?您可以尝试执行中列出的答案中的步骤,看看是否有帮助。随机目录。在列出大约480个目录后,它似乎失败了。失败后,如果调用Runtime.getRuntime().exec(“ls-l”);同样,如果不重新启动程序,它会在看到的第一个目录处失败。您是在等待每个
ls-l
进程完成,还是在并行执行所有命令?有一个
Process.waitFor()
方法可以确保每个进程都已退出。如果不等待进程退出,它可能仍在运行,这可能会消耗一些系统资源。嗨,Fly我已经在使用waitFor()。感谢您花时间提供帮助。正如Narendra Yadala所说,您必须明确关闭流程的输入和输出流,最好是在finally块中,但根据我的经验,仅此一点在这种情况下是没有帮助的。Linux/Unix中的每个进程stdout/stderr-streams似乎都有某种内部缓冲区,当缓冲区填满时,正在运行的进程将停止等待某人(即Java应用程序)从这些流中读取数据,然后再继续运行。如果您不这样做,进程将只是停留在那里,在某个时候您将耗尽一些系统资源(如打开的文件或Maxim)。您可能希望将
p.destroy()
添加到最终列表中。确切地说。如果不关闭流,OP可能会在内存耗尽之前耗尽文件描述符。而不是
destroy()
对于这些进程,我建议使用
waitFor()
让它们正常完成。使用
destroy()
“强制终止”这个过程,除非你知道这个过程不起作用,否则这是一件非常重要的事情。关闭输入/输出流确实解决了这个问题。谢谢!我应该澄清一下,我使用的是Android SDK的adb.exe。我想执行类似Runtime.getRuntime().exec(“adb shell ls-l”)的命令在不同的目录上多次。然后你应该把这个问题放在问题中,因为你的问题对于你需要得到的答案是不准确的。@幸运的是,这并没有真正回答这个问题。Android真的没有
java.io.File
?Android有吗?但是,java应用程序正在桌面计算机上运行,并且与使用adb.exe的Android设备。@jarrodRoberson是的,我应该。谢谢。