对于上面的例子,需要说明的有以下几点:

  1、BufferedReader是Reader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

 

  • BufferedReader(Reader in) 
  • BufferedReader(Reader in, int sz)

  这里的sz是指定缓冲区的大小。

  它的基本方法:

 

  • void close() //关闭流 
  • void mark(int readAheadLimit) //标记当前位置 
  • boolean markSupported() //是否支持标记 
  • int read() //继承自Reader的基本方法 
  • int read(char[] cbuf, int off, int len) //继承自Reader的基本方法 
  • String readLine() //读取一行内容并以字符串形式返回 
  • boolean ready() //判断流是否已经做好读入的准备 
  • void reset() //重设到近的一个标记 
  • long skip(long n) //跳过指定个数的字符读取

  2、InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给 BufferedReader使用。

  3、PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

  这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,后,我们需要格式化输出结果,于是将PrintWriter包在外层。

  Java提供了这样一个功能,将标准的输入输出流转向,也是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

 

  • import java.io.*; 
  • public class Redirecting { 
  •        public static void main(String[] args) throws IOException { 
  •               PrintStream console = System.out; 
  •               BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java")); 
  •               PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out"))); 
  •               System.setIn(in); 
  •               System.setOut(out); 
  •               BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); 
  •               String s; 
  •               while((s = br.readLine()) != null) 
  •                      System.out.println(s); 
  •               out.close(); 
  •               System.setOut(console); 
  •       } 
  • }

  在这里java.lang.System的静态方法:

 

  • static void setIn(InputStream in) 
  • static void setOut(PrintStream out)

  提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,直观了许多。

  Java流有着另一个重要的用途,那是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。