如果你在使用流的过程中出现了问题,那么你也许需要调试功能。
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它的缓冲。
虽然这个例子过于简化了,但是它仍然证明了流调试的有效性。当链中存在四个或者更多的流的时候,插入并且移动调试流将帮助开发者更快的发现问题。
闽公网安备 35060202000074号