import java.io.*; class MyFilter extends java.io.FilterWriter { 
public MyFilter(Writer w) { super(w); } 
public void write(String s, int off, int len) throws java.io.IOException { 
s = s.replace('1', '2'); 
super.write(s, off, len); 
} public void write(char[] cbuf, int off, int len) throws IOException { 
String s= new String(cbuf); 
this.write(s, off, len); 

}
public class example2 { 
public static void main(String args[]) { 
FileWriter myFW = null; 
try { 
myFW = new FileWriter( "dogs.txt" ); 
} catch(IOException x) { System.err.println("IOExcpn: " + x); } FilterWriter filter = new MyFilter( myFW ); 
BufferedWriter BW = new BufferedWriter(filter); 
PrintWriter myPW = new PrintWriter( BW ); 
myPW.println("101 Dalmatians"); 
myPW.close(); 

}
这里覆盖了FilterWriter的两个write()方法,我只是奇怪为什么,在执行myPW.close();语句时会自动调用public void write(char[] cbuf, int off, int len)方法呢(也就是MyFilter中第二个write()方法)? 

解决方案 »

  1.   

    很有可能嘛,内部调用时,参数用得是char[]
      

  2.   

    我觉得是你在你close的时候writer中还有东西,所以可能就要调用write方法将writer中的内容write出去。
    你可以在write方法中println一下,看看在close的时候write的是什么。
      

  3.   

    学习,试了下你的代码,有点奇怪,CLOSE()调用后会自动执行2个Write();但是把第2个Write()方法删了,第一个Write()方法就不执行了.
      

  4.   

    看了下JDK源文件,我知道答案了.CLOSE()方法里会调用WRITE.CLOSE(),前提WRITE !=NULL;呵呵!!!
      

  5.   

    不过WRITE的CLOSE()是个抽象方法,具体不知道JVM是怎样实现它的