在进行文件复制方式二的时候用到了缓冲区,char[] buf = new char[1024];这个就是缓冲区,这个缓冲区是我们自己创建的,使用缓冲区可以提高效率。因为缓冲区可以提高效率,所以Java把缓冲的功能封装起来,称为一个对象。其实缓冲区里面就是封装了一个数组,用来对流所操作的数据进行缓存。缓冲区的出现提高了对数据的读写效率。两个字符流缓冲对象BufferedWriter、BufferedReader。
1. BufferedWriter
BufferedWriter“将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ”“可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。”我们来看它的构造方法,缓冲区是用来提高读写效率的,所以,缓冲区需要处理数据,那么数据是从哪来的?是从输出流对象中读取到的,所以需要传入输出流对象。它的方法有关闭、flush、写出write,还多了一个进行换行的方法newLine() 。
在数据不是很多的情况下,我们可以这么写,把异常抛出去,这样看代码会比较方便些:
package com.java.base;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("test.txt");
fw.write("abcdefg");
fw.close();
}
}
这么写是OK的。现在,为了提高写出的效率,可以使用字符缓冲区,字符缓冲区不是必须要使用的,是根据你的需要才进行使用。通过分析,它确实可以提高效率。
1.创建了一个字符输出流的缓冲区对象,并和指定要被缓冲的流对象相关联。
2.使用缓冲区的写出方法将数据先写到缓冲区中。
3.关闭缓冲区
4.运行,结果OK。
5.关闭了缓冲区还要不要关闭输出流呢?我们来看一下,在字符缓冲区关闭之后,我们使用文件字符输出流写数据
6.这时候,运行报错Exception in thread "main" java.io.IOException: Stream closed。也就是说缓冲区在关闭的时候会把流对象关闭。所以不用再进行关闭输出流的操作。
7.代码
package com.java.base;
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("test.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("abcdefg1");
bw.close();
//fw.write("safd");//Exception in thread "main" java.io.IOException: Stream closed
}
}
缓冲区仅仅是用来提高读写效率的,它不操作底层,也就是说它不操作文件夹,操作文件的是文件字符输出流。
8.BufferedWriter 提供了一个进行换行的方法,这个方法是newLine();
bw.write("abcdefg1");
bw.newLine();
bw.write("asdfalsdkf");
9.在文件中多写几行:
for(int x=1; x<=4; x++){
bw.write("abcdefg"+x);
bw.newLine();
bw.flush();//最好加上flush,防止程序出问题时数据丢失
}
2. BufferedReader
在文件中写了数据,现在就来读取写出的数据是什么。
package com.java.base;
import java.io.FileReader;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
char[] chs = new char[1024];
int len = 0;
while((len = fr.read(chs)) != -1){
System.out.println(new String(chs,0,len));
}
fr.close();
}
}
BufferedReader“从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 ”BufferedReader有一个方法,这个方法可以读取一行的数据。把上面的代码封装到一个方法里,另外写使用缓冲区的代码,
package com.java.base;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
}
字符流缓冲区:
BufferedWriter 有一个特有方法newLine();这个方法是用来换行的。
BufferedReader也有一个特殊的方法,是用来读取一行的数据readLine();
两个方法是对应的。
3. 复制文本文件
package com.java.base;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("buf.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf_copy.txt");
BufferedWriter bw = new BufferedWriter(fw);
String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}