Превышен лимит на размер BufferedReader? - PullRequest
1 голос
/ 16 ноября 2010

В веб-приложении java 6 я пытаюсь получить большое количество выходных данных от выполненной команды. Я "позаимствовал / украл / основал" его в статье javaworld . Проблема, с которой я сталкиваюсь, заключается в том, что длина, по-видимому, превышает ограничение размера, поскольку вывод обрезается. Я вывел данные в файл, чтобы я мог видеть размер возвращаемого значения, и это ровно 32 КБ (32768). Я экспериментировал с изменением размера буфера по умолчанию (см. Конструктор BufferedReader), но я не наблюдал каких-либо изменений в длине возвращаемых данных независимо от того, какое значение я имею для размера буферизованного (очень маленького или очень большого) .

Любой совет будет очень признателен!

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;
    }
}

1 Ответ

0 голосов
/ 16 ноября 2010

Проблема не в размере буфера BufferedReader.

Я думаю, что настоящая причина - это то, что делает внешняя команда. Я подозреваю, что он спасается, не сбрасывая свой стандартный поток. Обратите внимание, что вы «проглатываете», но не выводите поток команды 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 - это Runnable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...