【问题标题】:Debugging i/o streams: watching for change调试 i/o 流:观察变化
【发布时间】:2011-11-23 21:25:41
【问题描述】:

在调试时,我想观察我的输入流,以了解它们何时接收到数据(并准备好读取)。我知道 Eclipse 调试器会突出显示更改的变量值,但这也适用于值中的值吗?

我的情况:我有一个 BufferedReaders 列表。我究竟应该导航到哪里来观察变化(通过在侧窗格中展开我的 BufferedReaders)?或者有没有办法观看顶级?如果这有什么不同,我的 i/o 流将附加到套接字。

【问题讨论】:

  • “到底有多深”是什么意思?

标签: java eclipse sockets io


【解决方案1】:

我担心无法从 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());
    }

}

}

【讨论】:

  • 酷!现在的想法已经足够好了。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2016-02-01
  • 2012-08-05
  • 2014-02-15
相关资源
最近更新 更多