IO流(二)——BufferedWriter、BufferedReader、LineNumberReader
程序员文章站
2024-03-06 16:21:38
...
一、BufferedWriter示例
public class BufferedWriterDemo {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("buf.txt");
//为了提高写入的效率。使用了字符流的缓冲区。
//创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
BufferedWriter bufw = new BufferedWriter(fw);
//使用缓冲区的写入方法将数据先写入到缓冲区中。
for(int x=1; x<=4; x++){
bufw.write("abcdef"+x);
bufw.newLine();
//使用缓冲区的刷新方法将数据刷目的地中。
bufw.flush();
}
//关闭缓冲区。其实关闭的就是被缓冲的流对象。
bufw.close();
}
}
运行结果:
二、BufferedReader示例
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null){
System.out.println(line);//读取一行,以回车符为分界线
}
bufr.close();
}
}
运行结果:
三、自定义的读取缓冲区,模拟一个BufferedReader类
思路:
缓冲区中无非就是封装了一个数组,并对外提供了更多的方法对数组进行访问,其实这些方法最终操作的都是数组的角标。
缓冲的原理:其实就是从源中获取一批数据装进缓冲区中,在从缓冲区中不断的取出一个一个数据,在此次取完后,在从源中继续取一批数据进缓冲区,当源中的数据取光时,用-1作为结束标记。
public class MyBufferedReader extends Reader {
private Reader r;
//定义一个数组作为缓冲区。
private char[] buf = new char[1024];
//定义一个指针用于操作这个数组中的元素。当操作到最后一个元素后,指针应该归零。
private int pos = 0;
//定义一个计数器用于记录缓冲区中的数据个数。 当该数据减到0,就从源中继续获取数据到缓冲区中。
private int count = 0;
MyBufferedReader(Reader r){
this.r = r;
}
/**
* 该方法从缓冲区中一次取一个字符。
* @return
* @throws IOException
*/
public int myRead() throws IOException{
//1,从源中获取一批数据到缓冲区中。需要先做判断,只有计数器为0时,才需要从源中获取数据。
if(count==0){
count = r.read(buf);
pos = 0;
}
if(count<0)
return -1;
char ch = buf[pos++];
count--;
return ch;
}
public String myReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch = myRead())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
//将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中。
sb.append((char)ch);
}
//假设最后一个字符不是回车符,则缓冲池的长度不为,所以继续返回缓冲池中的数据
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myClose() throws IOException {
r.close();
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
@Override
public void close() throws IOException {
}
}
测试代码:
public class MyBufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("C:\\Demo.txt");
MyBufferedReader bufr = new MyBufferedReader(fr);
String line = null;
while((line=bufr.myReadLine())!=null){
System.out.println(line);
}
bufr.myClose();
}
}
运行结果:
四、LineNumberReader示例
1,LineNumberReader是BufferedReader的子类,是BufferedReader的装饰设计模式
2,可以读取到行号
3,方法示例
setLineNumber(n)//设置行号从第n行开始
getLineNumber()//获取行号
4,代码示例:
public class LineNumberReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("C:\\Demo.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
lnr.setLineNumber(5);//设置行号从第5行开始
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);//获取行号
}
lnr.close();
}
运行结果
推荐阅读
-
java IO 字符流(三)BufferedReader与BufferedWriter
-
java基础回顾之 流(BufferedReader/BufferedWriter )字符缓冲流, 默认有8192个字符的缓冲区
-
IO流(二)——BufferedWriter、BufferedReader、LineNumberReader
-
Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
-
Java IO流操作(FileReader、BufferedReader)
-
字符缓冲输出流BufferedWriter与字符缓冲输入流BufferedReader:
-
javaSE25-- IO流--字符缓冲流BufferedReader/BufferedWriter
-
java基础(二) 流(Stream)、文件(File)和IO
-
JAVA IO流(二) 处理流
-
JAVA_IO学习笔记(二)_字符流_效率流