java - 循环读取 "ls/datadata"输出

标签 java android datainputstream

我正在开发一个必须读取 protected 文件夹内容的小型应用程序,因此我得出的结论是我必须将 su 与 ls 和输入流结合使用。

但是,当 readLine 函数到达输出末尾时,它就挂起。我猜这是因为最后一行不包含 EOL 标记...

代码:

 p = Runtime.getRuntime().exec("su");
 outputS = new DataOutputStream(p.getOutputStream()); 
 inputS = new DataInputStream(p.getInputStream());
 errorS = new DataInputStream(p.getErrorStream());


 outputS.writeBytes("ls /datadata" + "\n");
 outputS.flush();

 while((s = inputS.readLine()) != null)
 {
      Log.i("DS", s);
 }
 Log.i("DS", "done");

我该如何解决这个问题?我试过读取字符,然后等待 -1,但这没有用,与上面相同。理想情况下我会在没有系统调用的情况下执行此操作,但遗憾的是 Android 不允许我列出或复制此文件夹的内容...

感谢您阅读本文, 五胞胎

编辑:多亏了下面的答案,我解决了我的问题,无论您做什么,只要确保像使用 adb shell 时一样结束“su”任务即可。您可以使用接受的答案中描述的方法,或者在您完成需要做的任何事情后手动运行“退出”。由于我不知道的原因,运行 exit 确实会在错误流中生成两个空行。

最佳答案

su 仍在等待更多命令执行

您可以告诉 su 只执行一个命令,然后退出。 改变

p = Runtime.getRuntime().exec("su");

p = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /datadata"});

并删除 outputS...

关于java - 循环读取 "ls/datadata"输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7305042/

相关文章:

java - 在现有模型对象内传递对象,其中新对象参数未定义并且可能会更改

java - 如何在java中的单个集合中使用不同类型的数据

Android:动态添加单元格到GridView?

java - 套接字和数据输入流

C# <-> Java 套接字通信

java - JPA,GeneratedValue 自动递增 50

java - Struts2 将 SUCCESS 结果 fork 到不同的 JSP

java - 无法将数据从 FireBase 加载到 Recycler View 中

java - 在 firebase 实时数据库中保存子类

java - readUTF 在服务器端挂起