Java - (android) 在刷新其 OutputStream 后重用一个进程

标签 java android ioexception

我正在尝试在 Android 上执行此操作:

Process p = Runtime.getRuntime().exec("sh");

   DataOutputStream out = new DataOutputStream(p.getOutputStream());

   out.writeBytes("something useful\n");

   out.close();

   p.waitFor();

   out = new DataOutputStream(p.getOutputStream());

   out.writeBytes("something useful\n");

   out.close();

   p.waitFor();

第二次执行out.writeBytes(); ,我得到一个java IOException:“错误的文件编号”。 我的应用程序必须执行多个 native 程序,但始终使用相同的进程。 有人知道为什么这不起作用吗?

最佳答案

请注意,shell 不是公共(public) SDK 的一部分(请注意,SDK 文档中的任何地方都没有记录它),因此这段代码实际上依赖于私有(private) API。

此外,这会使您处于正常应用程序模型之外——我们无法保证您已 fork 且不受平台管理的进程会发生什么情况。它随时可能被杀死。

与执行命令在您自己的进程中执行的操作相比,这也是一种非常低效的执行方式。并且为一个命令启动一个单独的进程不会让它做任何你能做的事情,因为它仍然作为你的 uid 运行。

所以基本上...对于 99.99% 的应用,请不要这样做。如果您正在编写终端应用程序……好吧,好吧,无论如何只有极客才会关心它,而且它不会有太大用处,因为它作为您的 uid 运行,但是没关系。但除此之外,请不要。 :)

关于Java - (android) 在刷新其 OutputStream 后重用一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591000/

相关文章:

java - 可序列化的简单对象 IOException

java - 如何获取 JNA 结构数组的 c 指针

Android,防止ImageButton拉伸(stretch)TableLayout

android - Kotlin 从 Java 访问内部类中的常量

java - 在加载时要在属性文件中放入哪些值才能获取 IOException?

java - 如何在 Java 中找出损坏的 gz 文件

java - 了解Spring框架的执行流程——在XML文件中添加断点?

java - 帮助理解 hibernate 行为/错误

java - 计算Java中可用堆内存的大小

android - 如何以编程方式调整自定义 View 的大小?