java.io.Reader是一个很不错的读取字符流的抽象类,通过继承Reader类,我们可以很方便的读取字符流,比如,我们可以将一个字符串读取为一串串(字符)流,还可以读取一个文件里的内容为一串串的流。
Java(1.6.x)里提供了几种Reader的直接继承类,具体的有:BufferedReader, CharArrayReader, FileReader, InputStreamReader, PipedReader, StringReader等,子类须实现的方法只有 read(char[], int, int) 和 close()。
在这里主要介绍StringReader和FileReader两种。
1、 StringReader
通过StringReader可以很方便的将一个字符串读取为一串串流,具体的代码如下:
String s = "测试数值"; //得到一个Reader对象 Reader r = new StringReader(s); char[] buffer = new char[256]; try { //将字符读取为一串串流存入到buffer中 int dataLen = r.read(buffer); //可以将字符流再以字符串的形式打印出来 System.out.println(new String(buffer, 0, dataLen)); } catch (IOException e) { e.printStackTrace(); }
要注意的是,Reader对象的末尾并不是字符串的最后一个字符,而是-1,所以当dataLen为-1的时候,就表示已经读取完毕了。
2、FileReader
通过FilterReader很方便地可以得到一个文件的内容,并将内容读取为一串串的字符流,具体例子代码如下:
//装载字符流的长度,如果长度不够,将只装载一部分的内容 char[] buffer = new char[512]; File file = new File("D:/test.txt"); try { Reader r = new FileReader(file); int dataLen = r.read(buffer); System.out.println(new String(buffer, 0, dataLen)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
我们建立一个test.txt的文本文档,在其中输入三行:
A
B
C
然后用以上代码进行读取,输出的结果将是:
A
B
C
值得注意的是:dataLen的值为7,每一个字符占2个字节,这就表示最后还有一个字节,如果我们在
int dataLen = r.read(buffer);
之后再运行一遍:
dataLen = r.read(buffer);
就会发现dataLen=-1,这说明,最后一位值也是-1,并且占用一个字节的长度。
好了,到此就为止了,java.io.Reader家族在某些实际的应用中是非常方便和好用的。