【问题标题】:IOException at InputStreamReaderInputStreamReader 出现 IOException
【发布时间】:2012-11-21 04:08:43
【问题描述】:

创建一个具有多个函数的类,我遇到了其中一个函数的问题,该函数将使用 ProcessBuilder 发送命令并将其输出作为字符串,充当 shell 命令。当我使用它时,它会在 InputStreamReader 捕获带有错误文件编号的 IOException ,并返回“错误!!!” ,这是我的代码,如果您需要了解有关此评论的任何信息...我正在使用命令“ls”顺便说一句,“ls /sdcard/”...

     public String builder(String str) {    
    startTimer(); // A method that gets the current time as int
    String[] array = str.split(" " , 2);
    String cmd = array[0] + " " + array[1];
    System.out.println("\nexecuting: " + cmd + "----");
    String AllText = "";
    try {
        String anyString;
        //Process process = new ProcessBuilder("sh","-c","\"",cmd,"\"").start();
        Process process = new ProcessBuilder(array).start();

        BufferedReader OUT = new BufferedReader(new InputStreamReader(process.getInputStream())); // Here is My error
        BufferedReader ERR = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        try {
            for (int x = endTimer()/* a method which subtracts the startTimer() from current time to get the time passed */ ; endTimer()<= 5000 ; x++){
                process.waitFor();
            }process.destroy();

        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        while ((anyString = ERR.readLine()) != null) {
            AllText = AllText + "\n" + anyString;
        }
        while ((anyString = OUT.readLine()) != null) {
            AllText = AllText + "\n" + anyString;
            while ((anyString = ERR.readLine()) != null) {
                AllText = AllText + "\n" + anyString;
            }
        }

        return AllText;
    } catch (Exception ex) {
        ex.printStackTrace();
        return "ERROR!!!";

    }

这是按下按钮时的堆栈跟踪:

12-03 18:55:36.475: W/System.err(17973): java.io.IOException: read failed: EBADF (Bad file number)
12-03 18:55:36.507: W/System.err(17973):    at libcore.io.IoBridge.read(IoBridge.java:442)
12-03 18:55:36.507: W/System.err(17973):    at java.io.FileInputStream.read(FileInputStream.java:179)
12-03 18:55:36.507: W/System.err(17973):    at java.io.InputStreamReader.read(InputStreamReader.java:244)
12-03 18:55:36.507: W/System.err(17973):    at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
12-03 18:55:36.507: W/System.err(17973):    at java.io.BufferedReader.readLine(BufferedReader.java:354)
12-03 18:55:36.507: W/System.err(17973):    at com.example.activity.over.other.Shells.builder(Shells.java:542)
12-03 18:55:36.507: W/System.err(17973):    at com.example.activity.over.other.MainActivity$2.onClick(MainActivity.java:91)
12-03 18:55:36.514: W/System.err(17973):    at android.view.View.performClick(View.java:4202)
12-03 18:55:36.514: W/System.err(17973):    at android.view.View$PerformClick.run(View.java:17340)
12-03 18:55:36.514: W/System.err(17973):    at android.os.Handler.handleCallback(Handler.java:725)
12-03 18:55:36.514: W/System.err(17973):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-03 18:55:36.514: W/System.err(17973):    at android.os.Looper.loop(Looper.java:137)
12-03 18:55:36.514: W/System.err(17973):    at android.app.ActivityThread.main(ActivityThread.java:5039)
12-03 18:55:36.514: W/System.err(17973):    at java.lang.reflect.Method.invokeNative(Native Method)
12-03 18:55:36.522: W/System.err(17973):    at java.lang.reflect.Method.invoke(Method.java:511)
12-03 18:55:36.522: W/System.err(17973):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-03 18:55:36.522: W/System.err(17973):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-03 18:55:36.522: W/System.err(17973):    at dalvik.system.NativeStart.main(Native Method)
12-03 18:55:36.522: W/System.err(17973): Caused by: libcore.io.ErrnoException: read failed: EBADF (Bad file number)
12-03 18:55:36.530: W/System.err(17973):    at libcore.io.Posix.readBytes(Native Method)
12-03 18:55:36.530: W/System.err(17973):    at libcore.io.Posix.read(Posix.java:123)
12-03 18:55:36.530: W/System.err(17973):    at libcore.io.BlockGuardOs.read(BlockGuardOs.java:149)
12-03 18:55:36.530: W/System.err(17973):    at libcore.io.IoBridge.read(IoBridge.java:432)
12-03 18:55:36.530: W/System.err(17973):    ... 17 more

【问题讨论】:

  • 你的目标是实现shell还是读取sdcard文件列表?只是好奇,因为有更简洁的方法可以实现你的 shell 路线所追求的目标。
  • @njzk2 , 已发布, 看看...
  • @TheCapn 我使用“ls”的目的只是为了查看该方法是否有效,我想要这样做是为了促进整个过程,这样我就可以发送命令并获取其输出而不会出现异常,并且完全简单。这就是我想要的,如果你能帮我找到一些已经完成的课程可以做我想做的事,请告诉我,再加上这只是一个方法,我的班级大约有15种方法来做这种事情,我需要这样的东西!
  • 错误出现在第一个 readLine 处。如果没有 ERR,尝试从 ERR 读取可能会导致问题。
  • 我需要的是如何解决它:)

标签: java android inputstream ioexception processbuilder


【解决方案1】:

检查你是否在清单文件中错过了这个。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 我用过 Read_external_storage ,我会试试这个...谢谢 :) 编辑:没用,返回错误!!! ,同样的例外,我会发布堆栈跟踪。
  • 没用,请帮忙,或者如果可以的话,请自己尝试使用代码,如果您需要,我可以为您提供我的android测试应用程序项目,我只是用于测试和学习!
猜你喜欢
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2010-11-19
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多