簡體   English   中英

使用Runtime.exec時讀取錯誤

[英]Read Error when using Runtime.exec

之前在Stack Overflow上曾問這個問題,但是堆棧跟蹤與我的不同,我認為這不是同一件事引起的。

這是我的堆棧跟蹤:

java.io.IOException: Read error
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at General.App.cmdString(App.java:393)
at General.App.cpauString(App.java:422)
at Functionality.RegistryScanThread.USBDScan(RegistryScanThread.java:109)
at Functionality.RegistryScanThread.doInBackground(RegistryScanThread.java:51)
at Functionality.RegistryScanThread.doInBackground(RegistryScanThread.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

這是我編寫的更復雜程序的簡化版本:

import java.util.*;
import java.io.*;
public class Test {

//global vars

public Test(){
    // initializeing stuffs
}
public static void main(String[] args){
    ArrayList<String> str = cmdString("reg query hklm");
    for(String s : str){
        System.out.println(s);
    }
}

public static ArrayList<String> cmdString(String command){
    boolean success = false;
    ArrayList<String> result = new ArrayList<String>();
    String line = "";
    try{ 
        Process p = Runtime.getRuntime().exec(command);
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((line = input.readLine()) != null) {result.add(new String(line));}
        BufferedReader input2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = input2.readLine()) != null) {result.add(new String(line));}
        int exitvalue = p.waitFor();
        if (exitvalue != 0){
            System.out.println("error!!");
            success = false;

        }
        else{
            success = true;
        }
        for(String s : result){
            System.out.println(s);
        }
        input.close();
        input2.close();
        return result;
    } catch(Exception e) {
        e.printStackTrace(System.err);
        System.out.println("error!!!");
        return result;
    }
}
}

基本上。 在上面的示例中,該錯誤不是真正可見的。 但是在我的程序中,它在我第一次運行時可以正確執行所有操作。

然后...當我第二次或第三次運行它時,會發生錯誤。 另外...看來,當我等待一段時間再重新運行時,似乎沒有發生錯誤。

我該如何解決這個問題?

我想這就是答案,很抱歉,僅根據我提供的代碼不可能回答我的問題。

基本上發生了什么事。

  1. 我程序中的cmdString()方法正在啟動一個進程,並嘗試從其輸出流和錯誤流中讀取。
  2. 碰巧我的程序啟動的過程是我設計的C ++應用程序,它使用自定義管道重定向輸入和輸出。
  3. 這個C ++應用程序有一個用於標准輸出的管道,但是我碰巧沒有為標准錯誤創建一個管道。
  4. 因為我沒有創建標准錯誤管道,所以我的cmdString()方法試圖從我沒有創建的管道中讀取數據。 因此,我在與錯誤流相對應的“ line = input2.readLine())”行上得到了錯誤。
  5. 因此,總而言之,該錯誤是由於嘗試從未產生錯誤流的進程中讀取錯誤流所致。

我相信這就是發生的事情。

當我看到觸發錯誤的確切行時,我發現了錯誤。 我能夠看到普通流不會產生錯誤,但是錯誤流會產生錯誤。 我以為這很奇怪,我立刻想起了我的C ++應用程序沒有錯誤流。

讓我知道這個答案是否合理!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM