android exec,关于android:Java Runtime.getRuntime()。exec()在调用它几百次后失败

我有一个执行的Java程序

Runtime.getRuntime()。exec("ls -l");

很多次,一次为系统中的每个目录。

我的测试系统有超过1,000个目录和Runtime.getRuntime()。exec("ls -l"); 似乎在480个目录之后出错了。

我得到的错误消息是"运行exec()时出错。命令:[ls,-l]工作目录:null环境:null"。

我猜它已经耗尽了一些必需的系统资源,或者是吗?

有没有办法处理所有目录而不会出错?

答案的相对评论:

I should clarify that I was using Android SDK's adb.exe. I wanted to

execute something like Runtime.getRuntime().exec("adb shell ls -l")

multiple times on different directories.

它是在某个特定目录上失败还是每次都是一个随机目录?

您可以尝试执行stackoverflow.com/questions/5963741/中列出的答案中的步骤,看看是否有帮助。

随机目录。 列出480个目录后似乎失败了。 失败后,如果我调用Runtime.getRuntime()。exec("ls -l"); 再次没有重新启动程序,它在它看到的第一个目录失败。

您是否在等待每个ls -l进程完成,或者您是否正在并行执行命令? 有一个Process.waitFor()方法可以确保每个进程都退出。 如果您不等待进程退出,它可能仍在运行,这可能会占用一些系统资源。docs.oracle.com/javase/6/docs/api/java/lang/

嗨,Fly我已经在使用waitFor()了。 感谢您抽出宝贵时间提供帮助。

使用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();

}

}

正如Narendra Yadala所说,你明确地关闭了流程的输入和输出流,最好是在最后的块中,但从我的经验来看,仅在这种情况下无法帮助。似乎Linux / Unix中的每进程stdout / stderr -streams都有某种内部缓冲区,当缓冲区填满时,正在运行的进程停止等待某人(即你的Java应用程序)读出数据在它继续之前从那些流中。如果你不这样做,过程就会坐在那里,在某些时候你会耗尽一些系统资源(比如打开文件或格言)

您可能希望将p.destroy()添加到finally列表中。

究竟。如果不关闭流,OP可能会耗尽文件描述符,然后才能耗尽内存。

而不是destroy()进程,我建议使用waitFor()让它们正常完成。使用destroy()"强制终止"该过程,除非您知道该过程不起作用,否则这是一件非常重要的事情。

关闭输入/输出流确实解决了问题。谢谢!

只要p.waitFor()位于非异常路径中,将p.destroy()放在finally列表中可能比关闭每个流更好,除非您还想处理每个close()方法的异常。

最好在这些类上使用java.io.File和适当的方法来遍历和操作文件系统。

您没有说明为什么要以这种方式执行此退化行为,但这是列出树中所有文件的示例。

I have a Java program that executes Runtime.getRuntime().exec("ls

-l"); many times, once for each directory in the system.

为什么? File.listFiles()出了什么问题?

你甚至不需要执行'ls'。

我应该澄清一下我使用的是Android SDK的adb.exe。我想在不同的目录上多次执行Runtime.getRuntime()。exec("adb shell ls -l")之类的东西。

那么你应该把这个放在问题中,因为你的问题对于你需要得到的答案是不准确的。

@lucky这并没有真正回答这个问题。 Android真的没有java.io.File吗?

Android确实如此。但是,Java应用程序正在运行台式计算机并使用adb.exe与Android设备通信。

@Jarrod Roberson是的,我应该。谢谢。

应该包含在答案中的原因是adb.exe可能是问题的一部分,信息越准确,答案就越准确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用提到了Runtime.getRuntime().exec()方法,该方法可以在Android中执行命令或创建进程。根据引用,您可以使用这种方法从Java代码中调用Python脚本。但需要注意的是,引用指出正确的写法应该是Runtime.getRuntime()而不是getruntime。因此,根据您的问题"android8 Runtime.getRuntime().exec",您可以使用以下代码来执行命令或创建进程: ```java Runtime runtime = Runtime.getRuntime(); String command = "your_command_here"; try { Process process = runtime.exec(command); // 处理进程的输出或其他操作 } catch (IOException e) { e.printStackTrace(); } ``` 在上述代码中,将"your_command_here"替换为您要执行的具体命令。这样,您就可以在Android 8及以上版本中使用Runtime.getRuntime().exec()方法执行命令或创建进程了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [使用runtime.getruntime.execJava调用python脚本(Calling python script from Java using runtime....](https://blog.csdn.net/weixin_39618730/article/details/110567660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Android Runtime.getRuntime().exec()](https://blog.csdn.net/xianrenli38/article/details/117484708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值