<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
假如你在使用流的過程中出現了問題,那麼你也許需要調試功能。
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它的緩沖。
雖然這個例子過於簡化了,但是它仍然證實了流調試的有效性。當鏈中存在四個或者更多的流的時候,插入並且移動調試流將幫助開發者更快的發現問題。