调试i / o流:观察变化

时间:2011-11-23 21:25:42

标签: java eclipse sockets io

调试时,我想看看我的输入流,告诉他们什么时候收到数据(并准备好阅读)。我知道Eclipse调试器突出显示已更改的变量值,但这是否也适用于值内的值?

我的情况:我有一个BufferedReaders列表。我到底在哪里导航以观察更改(通过在侧窗格中展开我的BufferedReaders)?或者有没有办法观看顶级?如果有任何不同,我的i / o流将附加到套接字。

1 个答案:

答案 0 :(得分:1)

我担心不可能从Eclipse自动突出显示“已更改”的读者。突出显示保留用于变量本身的更改。在对象的情况下,“更改”意味着它们将指向不同的对象,而事实并非如此:您的变量都继续引用相同的BufferedReader实例。通过类树下降最终会使您获得所需的信息,但同时对多个变量执行此操作非常痛苦。

如果您需要关注的实际读者数量不是太大,以下内容可能对您有所帮助:您可以继承BufferedReader并覆盖toString(),以便输出对您有用的信息。这样,只要单击“变量”选项卡中的实际变量,或者使用箭头键突出显示该信息,就会看到该信息。不如Eclipse的自动突出显示,但也许还不够好?

这是一个简单的例子。在'System.out.println(in.read())'行中放置一个断点,并查看调试器中的'in'变量。第一次,你会看到'available: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());
    }

}

}