------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------
为了增加程序的效率,通常对于字节流,会创建byte数组进行字节缓存,对与字符流会使用char数组进行缓存。读取数据时对于文本文件读取操作时可以按照行分隔符进行分割。
对于行分隔符,则又存在平台相关性,不同平台对行分割符定义不同。可以使用jdk提供的File类的separator。
BufferedReader包装了FileReader类,可以在此基础上自己实现BufferedReader的功能。
// 定义MyBufferedReader,实现与BufferedReader,相同的功能
class MyBufferedReader {
// 包装FileReader
private FileReader r;
// 定义构造器,传入FileReader对象
publicMyBufferedReader(FileReader r) {
this.r = r;
}
// 模拟readline();实现读取一行的方法
public String myReadLine() throws IOException {
// 创建StringBuild对象,StringBuild的底层是数组的实现
// 可通过append()追加数据
StringBuildersb = new StringBuilder();
// 将读取的字符保存到ch
int ch = 0;
while ((ch = r.read()) != -1) {
// 如过读到'\r',忽略
if (ch == '\r')
continue;
// 读到'\n',说明到了行结尾,输出已读到的数据
if (ch == '\n')
return sb.toString();
// 读到的不是'\r'或'\n',则添加到可变字符串
sb.append((char) ch);
}
// 当上面的代码读取文本结尾没有'\n'字符的文本时,会忽略最后一行
// 此处添加对容器的判断,如果StringBuild非空,则也添加到sb
// 保证文本最后一行即使没有换行也能输出。
if (sb.length() != 0)
return sb.toString();
// 如果文本为空,则返回null
return null;
}
}
//再创建一个测试类,测试MyBufferedReader
public classMyBufferedReaderDemo {
public static void main(String[] args) throws IOException {
MyBufferedReadermbr= newMyBufferedReader(newFileReader("buf.txt"));
Strings = null;
while ((s = mbr.myReadLine()) != null)
System.out.println(s);
}
}
总结以上代码:即jdk提供的BufferedReader是对FileReader的包装,免去自己读取文本时自己创建缓冲字符数组。
本例是基于StringBuild创建的缓冲区,实现了读一行的方法。
BufferedReader的构造方法有两个:
BufferedReader(Reader in) |
BufferedReader(Reader in, int sz) |
第二个构造方法中的第一个参数指定字符输入流,第二个参数指定缓冲区大小。通常使用默认的缓冲区大小。
------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------