gpt4 book ai didi

java - Runtime.getRuntime 执行

转载 作者:行者123 更新时间:2023-11-29 21:53:34 26 4
gpt4 key购买 nike

我创建了一个类来处理 Android 应用程序中的根命令,该类在大多数情况下都运行良好。我使用 Runtime.getRuntime().exec("su") 创建进程,然后使用 DataOutputStream 输入命令,并使用 DataInputStream 和弃用的 readLine 从命令中获取数据。 (我试过使用 BufferedReader,但问题没有区别)。

我的问题是,如果命令产生错误,应用程序将挂起。 F.eks。如果我执行命令“[ -f/test ] && md5sum/test” || echo 0” 我不会有任何问题。但是,如果我执行“md5sum/test”并且文件不存在,我将不得不强制关闭该应用程序,因为它无处可去。在这个例子中,解决方案只是像第一个示例一样检查文件,但并非所有情况都这么简单。问题可能会发生,当它们发生时,人们不应该强制关闭应用程序。

有办法解决这个问题吗?

最佳答案

您的应用程序可能挂起,因为您可能没有处理衍生进程生成的 stderr/stdout。这背后的原因是生成的进程具有非常小的输出缓冲区(通常只有几千字节)。一旦这些缓冲区已满,该进程将挂起,直到其缓冲区释放出足够的空间来继续写入输出文本。我怀疑您在运行第二个命令时遇到问题,因为第二个命令失败并生成大量控制台输出。您的子进程用完了缓冲区空间,然后尝试阻塞直到有更多空间可用,但这种情况永远不会发生。

Runtime.getRuntime().exec() 返回 Process 的实例。 Process 对象有一个访问器方法(我相信它是 getInputStream()),它允许您使用它的标准输出。您还需要对 getErrorStream() 执行相同的操作。通常,我得到 InputStream,然后有一个单独的线程不断地使用来自 InputStream 的数据,直到它关闭。您不需要对数据本身做任何事情,只需阅读它即可。这将告诉底层进程它可以清除其输出缓冲区,希望在它们变满之前(从而导致进程阻塞)。

此外,我不是 100% 熟悉 Android,但在普通的 ol' java 中,最好使用 ProcessBuilder 来生成子 Process 实例。这是因为 ProcessBuilder 允许您将子进程的 stderr 和 stdout 组合在同一个流中,这样您就可以通过从 process.getInputStream() 返回的流中读取数据来在单个线程中使用这两者

关于java - Runtime.getRuntime 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13806654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com