缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。该缓冲区中提供了一个跨平台的换行符。newLine();
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException
{
//创建一个字符写入对象。
FileWriter fw = new FileWriter("buf.txt");
//为了提高字符写入流效率,加入了缓冲技术。
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter(fw);
for (int x=1;x<5;x++)
{
bufw.write("abcd"+x);
bufw.newLine();
bufw.flush();
}
//记住,只要用到缓冲区,就要记得刷新。
//bufw.flush();
//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
}
}
//输出
Snip20190917_18.png
Snip20190917_17.png
字符读取流缓冲区:该缓冲区提供了一个一次读一行的方法readLine,方便于对文本数据的获取。当返回null时,表示读到文件末尾。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
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();
}
}
//输出
abcd1
abcd2
abcd3
abcd4
通过缓冲区复制一个.java文件。
import java.io.*;
public class CopyTextByBuf {
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("DateDemo.java"));
bufw = new BufferedWriter(new FileWriter("DateDemo_Copy0.txt"));
String line = null;
while ((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally {
try {
if (bufr!=null)
bufr.close();
}catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try {
if (bufw!=null)
bufw.close();
}catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
//输出
Snip20190917_20.png
readLine方法的原理:无论是读一行,或者读取多个字符。其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。
明白了BufferedReader类中特有方法readLine的原理后,可以自定义一个类中包含一个功能和readLine一直的方法。来模拟一下BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class MyBufferedReader
{
private FileReader r;
MyBufferedReader(FileReader r)
{
this.r = r;
}
//可以一次读一行数据的方法。
public String myReadLine()throws IOException
{
//定义一个临时容器。原BufferReader封装的是字符数组。
//为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
StringBuilder sb = new StringBuilder();
int ch = 0;
while ((ch=r.read())!=-1)
{
if (ch=='\r')
continue;;
if (ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
//防止最后一行没有\n符
if (sb.length()!=0)
return sb.toString();
return null;
}
public void myClose() throws IOException
{
r.close();
}
}
public class MyBufferedReaderDemo {
public static void main(String[] args) throws IOException
{
//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader("buf.txt");
//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
MyBufferedReader bufr = new MyBufferedReader(fr);
String line = null;
while ((line=bufr.myReadLine())!=null)
{
System.out.println(line);
}
bufr.myClose();
}
}
//输出
abcd1
abcd2
abcd3
abcd4
网友评论