Reader是用于输入字符数据的,它所根据的 方法跟InputStream基本一样。它是所有输入字符流的抽象父类,因此不能直接构建Reader的实例,必须通过它的子类来构建。以下是几个常用的子类:
1、字符数组作为输入源——CharArrayReader
CharArrayReader包含一个内部缓冲区,该缓冲区包括从流中读取的字符数组。所谓内存缓存区,就是对应了内存中存在的字符数组,因此可以根据字符数组来创建该类的实例。它有以下两个构造函数:
CharArrayReader(char[] buf); CharArrayReader(char[] buf,int offset,int length);
以下是通过一个字符数组创建字符输入流的过程,并从该输入流中读取数据输出到控制台:
import java.io.CharArrayReader; import java.io.IOException; public class TestCharArrayReader { public static void main(String[] args) throws IOException { // 初始化字符数组 char[] buf = new char[3]; buf[0] = 'a'; buf[1] = 'b'; buf[2] = 'c'; // 创建输入流 CharArrayReader car = new CharArrayReader(buf); // 从输入流中读取数据 char buf2[] = new char[3]; car.read(buf2); System.out.println(buf2); // System.out.println(new String(buf2)); // 关闭输入流 car.close(); } }
2、文件作为输入源——FileReader
FileReader是用来读取字符文件的便捷类。FileReader用于读取字符流,要读取原始字节流,请考虑使用FileInputStream。
FileReader实例可以通过以下的两种方式创建,既可以从文件对象创建,也可以直接根据文件名创建:
FileReader(File file); //从文件对象创建
FileReader(String fileName);//直接根据文件名创建
下面程序演示如何读取一个磁盘文件来创建一个文件输入流,并循环读取该数据流中的数据并输出到控制台上
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TestFileReader { public static void main(String[] args) { try { // 创建文件输入流 FileReader fr = new FileReader("D:/demo/test.txt"); // 从输入流中读取数据 while (fr.ready()) { int i = fr.read(); System.out.println((char) i); // 关闭输入流 fr.close(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3、字符串作为输入源——StringReader
此类允许输入流由字符串内容提供,与CharArrayReader使用字符数组作为输入源类。穿件方法只有一个:
StringReader(String s); //从字符串中读取
下面就是一个实例的创建过程
import java.io.IOException; import java.io.StringReader; public class TestStringReader { public static void main(String[] args) { // 创建字符串输入流 StringReader sr = new StringReader("Hello world"); // 从输入流中读取数据 try { int c; while ((c = sr.read())!=-1) { System.out.print((char) c); } // 关闭流 sr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
4、缓存输入流——BufferedReader
BufferedReader从字符输入流中读取文本,缓存各个字符,从而实现字符、数组和行的高效读取。建议用BufferedReader包装所有其read()操作如FileReader和InputStreamReader开销很高的Reader。
创建方式有两种:
BufferedReader(Reader in); //创建一个使用默认大小输入缓存区的缓存字符输入流 BufferedReader(Reader in,int sz); //创建一个使用指定大小输入缓存区的缓存输入流
如果需要一个具有缓存的文件输入流,则应当组合使用FileReader和BufferedReader,这将能提高读取效率。以下就是将文件输入流对象转换为缓存流的过程:
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TestBufferedReader { public static void main(String[] args) { try { // 创建文件输入流 FileReader fr = new FileReader("D:demo/test.txt"); // 创建数据缓存流 BufferedReader br = new BufferedReader(fr); // 从输入流中读取数据 while (br.ready()) { int c = br.read(); System.out.print((char) c); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }