体验流调试的威力

文章作者 100test 发表时间 2007:10:10 11:38:32
来源 100Test.Com百考试题网


如果你在使用流的过程中出现了问题,那么你也许需要调试功能。

Java的I/O框架是基于一系列连接在一起的流实现的。当这种设计增强了部件重用性的同时,它也使得定位错误变得困难。通过在流中插入你自己定义的调试流的时候,错误定位将会变得更简单。例如,调试流CountingOutputStream这个类报告它已经写了多少个字节。这个功能对使用flush造成字节丢失的情况非常有用。

下面是一个使用CountingOutputStream的例子:

package com.generationjava.io.

import java.io.IOException.
import java.io.OutputStream.
import java.io.FilterOutputStream.

public class CountingOutputStream extends FilterOutputStream {

private int count.

public CountingOutputStream( OutputStream out ) {
super(out).
}

public void write(byte[ ] b) throws IOException {
count = b.length.
super.write(b).
}

public void write(byte[ ] b, int off, int len) throws IOException {
count = len.
super.write(b, off, len).
}

public void write(int b) throws IOException {
count = 2.
super.write(b).
}

public int getCount( ) {
return this.count.
}

}
在下面的小片代码中,存在一个简单的错误—流既没有被flush也没有被关闭。

File file = ....
byte[ ] data = ....
OutputStream out = new BufferedOutputStream(
new FileOutputStream( file )
).
out.write(data).
插入CountingOutputStream来发现问题:

File file = ....
byte[ ] data = ....
CountingOutputStream cos = new CountingOutputStream(
new FileOutputStream( file )
).
OutputStream out = new BufferedOutputStream( cos ).
out.write(data).
System.err.println( "Bytes written: " cos.getCount( ) ).
如果这段代码输出:

Bytes Written: 0

那么可以很快的发现问题出在BufferedOutputStream上,它没有发送任何东西给FileOutputStream流。这种方法可以更容易发现作为缓冲的流没有flush它的缓冲。

虽然这个例子过于简化了,但是它仍然证明了流调试的有效性。当链中存在四个或者更多的流的时候,插入并且移动调试流将帮助开发者更快的发现问题。


相关文章


setUTCMinutes方法
encodeURIComponent方法
ScriptEngineMajorVersion函数
专业语言:getVarDate方法
体验流调试的威力
专业语言:JAVA的类和接口
Java技巧:用Java保存位图文件
解决J 开发Web程序中文显示三种方法
Java技术与.NET的集成将打破SOA应用壁垒
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛