1

Java 6 webapp で、実行されたコマンドから大量の出力を取得しようとしています。私はそれを「借りた/盗んだ/ベースにした」javaworldの記事に基づいています。私が直面している問題は、出力が切り取られているため、長さがサイズ制限を超えているように見えることです。返されるサイズを確認できるように、データをファイルに出力しました。これは正確に 32K (32768) です。バッファーのデフォルト サイズを変更して実験しましたが (BufferedReader コンストラクターを参照)、buffered-size の値に関係なく、返されるデータの長さに変化は見られませんでした (非常に小さいものから非常に大きいものまで)。 .

どんなアドバイスでも大歓迎です!

public class StreamGobbler extends Thread {

private InputStream is;
private String type;
private List<String> output;

public StreamGobbler(InputStream is, String type) {
    this.is = is;
    this.type = type;
}

@Override
public void run() {
    try {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        this.output = new ArrayList<String>();
        while ((line = br.readLine()) != null) {
            this.getOutput().add(line + "\n");
            System.out.println(type + ">" + line);
        }
        br.close();
    } catch (IOException ioe) {
        System.err.println("ERROR: " + ioe.getMessage());
    }
}

/**
 * @return the output
 */
public List<String> getOutput() {
    return output;
}

}

public class JobClassAds {

private String CONDOR_HISTORY = "condor_history";
private String CONDOR_HISTORY_XML = CONDOR_HISTORY + " -xml";
private String CONDOR_HISTORY_LONG = CONDOR_HISTORY + " -long";

public String getHistory() {
    try {
        Runtime runtime = Runtime.getRuntime();
        String exec = CONDOR_HISTORY_LONG;
        Process process = runtime.exec(exec);
        System.out.println("Running " + exec + " ...");

        // Error message
        StreamGobbler errGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");

        // Output
        StreamGobbler outGobbler = new StreamGobbler(process.getInputStream(), "OUTPUT");

        Thread outThread = new Thread(outGobbler);
        Thread errThread = new Thread(errGobbler);

        outThread.start();
        errThread.start();

        outThread.join();
        errThread.join();

        /*
        String line = null;

        while ((line = input.readLine()) != null) {
            System.out.println(line);
            content.append(line);
        }

         *
         */

        int exitVal = process.waitFor();

        List<String> output = outGobbler.getOutput();
        String inputString = "";
        for (String o : output) {
            inputString += o;
        }

        System.out.println(exec + " Exited with error code " + exitVal);

        BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/history_result.xml"));
        out.write(inputString);
        out.close();
        return inputString;

    } catch (Exception e) {
        System.err.println(e.getMessage());
        return null;
    }
}
4

1 に答える 1

1

問題はBufferedReaderのバッファ サイズではありません。

本当の原因は、外部コマンドが行っていることだと思います。stdout ストリームをフラッシュせずに救済していると思われます。「ゴブリング」しているが、コマンドの stderr ストリームを出力していないことに注意してください。そこに、問題の本当の原因を示す証拠が見つかるかもしれません。


ところで、あなたはStreamGobblerクラスを次善の方法で使用しています。拡張Threadされるため、意図した使用方法は次のとおりです。

    SteamGobbler sg = new StreamGobbler(...);
    sg.start();
    sg.join();

しかし、あなたは効果的にこれを行っています:

    SteamGobbler sg = new StreamGobbler(...);
    Thread th = new Thread(sg);
    th.start();
    th.join();

Thread それは機能します...しかし、 a is-a という理由だけですRunnable

于 2010-11-15T23:28:50.477 に答える