如果你在使用流的过程中出现了问题那么你也许需要调试功能 Java的I/O框架是基于一系列连接在一起的流实现的当这种设计增强了部件重用性的同时它也使得定位错误变得困难通过在流中插入你自己定义的调试流的时候错误定位将会变得更简单例如调试流CountingOutputStream这个类报告它已经写了多少个字节这个功能对使用flush造成字节丢失的情况非常有用 下面是一个使用CountingOutputStream的例子 package comgenerationjavaio; import javaioIOException; import javaioOutputStream; import javaioFilterOutputStream; public class CountingOutputStream extends FilterOutputStream { private int count; public CountingOutputStream( OutputStream out ) { super(out); } public void write(byte[ ] b) throws IOException { count += blength; superwrite(b); } public void write(byte[ ] b int off int len) throws IOException { count += len; superwrite(b off len); } public void write(int b) throws IOException { count += ; superwrite(b); } public int getCount( ) { return unt; } } 在下面的小片代码中存在一个简单的错误—流既没有被flush也没有被关闭 File file = ; byte[ ] data = ; OutputStream out = new BufferedOutputStream( new FileOutputStream( file ) ); outwrite(data); 插入CountingOutputStream来发现问题 File file = ; byte[ ] data = ; CountingOutputStream cos = new CountingOutputStream( new FileOutputStream( file ) ); OutputStream out = new BufferedOutputStream( cos ); outwrite(data); Systemerrprintln( Bytes written: +cosgetCount( ) ); 如果这段代码输出 Bytes Written: 那么可以很快的发现问题出在BufferedOutputStream上它没有发送任何东西给FileOutputStream流这种方法可以更容易发现作为缓沖的流没有flush它的缓沖 虽然这个例子过于简化了但是它仍然证明了流调试的有效性当链中存在四个或者更多的流的时候插入并且移动调试流将帮助开发者更快的发现问题 |