【问题标题】: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());
}
}
}