Отладка потоков ввода / вывода: следите за изменениями - PullRequest
3 голосов
/ 24 ноября 2011

Во время отладки я хотел бы посмотреть мои входные потоки, чтобы сказать, когда они получили данные (и готовы к чтению).Я знаю, что отладчик Eclipse выделяет измененные значения переменных, но может ли это работать и для значений внутри значений?

Моя ситуация: у меня есть список BufferedReaders.Куда именно мне перейти, чтобы следить за изменениями (развернув мои BufferedReaders в боковой панели)?Или есть способ посмотреть верхний уровень?Мои потоки ввода / вывода присоединяются к сокетам, если это имеет какое-либо значение.

1 Ответ

1 голос
/ 24 ноября 2011

Боюсь, что в Eclipse невозможно автоматически получить подсветку для «измененных» читателей.Подсветка зарезервирована для изменений самих переменных.В случае объектов «изменение» означает, что они будут указывать на другой объект, а это не так: все ваши переменные продолжают ссылаться на одни и те же экземпляры BufferedReader.Спуск по дереву классов в конечном итоге приведет вас к информации, к которой вы стремитесь, но делать это для более чем одной переменной одновременно довольно болезненно.

Если фактическое число читателей, за которыми вы должны следить,не слишком большой, вам может помочь следующее: вы можете создать подкласс BufferedReader и переопределить toString (), чтобы он выводил полезную для вас информацию.Таким образом, вы видите эту информацию всякий раз, когда нажимаете на фактическую переменную на вкладке «Переменные», или когда вы используете клавиши со стрелками, чтобы выделить ее.Не так хорошо, как автоматическое выделение Eclipse, но, возможно, достаточно хорошо?

Вот простой пример.Поместите точку останова в строку «System.out.println (in.read ())» и посмотрите на переменную «in» в отладчике.В первый раз вы увидите «доступно: 34».В следующих случаях вы увидите «available: 0», потому что BufferedReader уже полностью прочитал входной поток, и все последующие чтения будут происходить из буфера BufferedReader.

public class InputStreamDebugTest {

public static class MyReader extends BufferedReader {

    private final InputStream in;

    public MyReader(InputStream in) {
        super(new InputStreamReader(in));
        this.in = in;
    }

    @Override
    public String toString() {
        try {
            return "available: " + in.available();
        } catch (IOException e) {
            return "Exception: " + e.getMessage();
        }
    }

}

public static void main(String[] args) throws IOException {

    MyReader in = new MyReader(new ByteArrayInputStream("Just some minor text for debugging".getBytes()));
    while (true) {
        System.out.println(in.read());
    }

}

}
...