一定要明确缓冲流是什么东西,当我们用字符或者字节流去操作文件的时候其实中间可以用一个缓冲流去加快速度。没错这个缓冲流的意义就是为了加快速度的中间媒介,这里就可以理解成我们玩吃鸡的加速器。没有加速器,照样可以吃鸡,只不过会有很大的延迟。也就是网速慢哈哈。
字符缓冲流:BufferedReader BufferedWriter
这里我们只需要从我的上两篇博客中截取部分代码加上缓冲流就好了
缓冲字符流读取:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* @author Hercules
* @version 创建时间:2020年2月13日 下午5:44:39
* 缓冲类
*/
public class Buffer {
public static void main(String[] args) {
readBufferedFile();
}
/**
* 缓冲字符流读取
*/
public static void readBufferedFile() {
Reader reader = null;
BufferedReader br = null;
try {
reader = new FileReader("C:\\Users\\张帅\\Desktop"+File.separator+"test.txt");
br = new BufferedReader(reader);
String str = null;
StringBuilder sb = new StringBuilder();//创建一个可变的字符串
//每次读取一行
while((str = br.readLine()) != null) {
sb.append(str);
//因为readLine()使用换行符来确认读取多少,所以不会读取换行符
sb.append("\n");
}
System.out.println(sb.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { //这里关流有一个原则先开的后关,后开的先关
if(br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下:
正如我在上面说的缓冲流就是起到一个中介加速的作用,这里需要注意的是,这里我们一共开了两个流,所以我们要注意关流的顺序,这里的顺序是这样的先开的后关,后开的先关。如果你学过数据结构的话我相信大家很自然的就想到了栈。
下面函数就给出了
/**
* 字符缓冲输出流
*/
public static void writeBuddered() {
Writer writer = null;
BufferedWriter bw = null;
String str = "我是一个新的字符串";
try {
writer = new FileWriter("C:\\Users\\张帅\\Desktop"+File.separator+"test.txt",true);
//这里true的意思就是将内容追加到文件中而不是覆盖原本文件的内容
bw = new BufferedWriter(writer);
bw.write(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这里大家要注意
writer = new FileWriter("C:\\Users\\张帅\\Desktop"+File.separator+"test.txt",true);
这段代码中的true参数,这个参数就是为了让我们加进去的内容是追加在原本文件中的,而不是覆盖原本文件内容
下面再来介绍缓冲字节输入输出流:
这里我就用我的那个qq头像吧。就是下面这个文件哈哈:
/**
* 缓冲字节输入输出流
*/
public static void stream() {
InputStream inputStream = null;//字节输入流
BufferedInputStream bis = null;//缓冲字节输入流
OutputStream outputStream = null;//字节输出流
BufferedOutputStream bos = null;//缓冲字节输出流
try {
File file = new File("C:\\Users\\张帅\\Desktop" + File.separator +"power.png");
inputStream = new FileInputStream(file);
bis = new BufferedInputStream(inputStream);
//这里的意思是把我们将读到的字节写入一个power1.png的文件中去
//当然如果指定位置还没有这个文件就会创建一个
outputStream = new FileOutputStream("C:\\Users\\张帅\\Desktop" + File.separator +"power1.png");
bos = new BufferedOutputStream(outputStream);
byte [] bytes = new byte[1024];
int len = 0;
while((len = bis.read(bytes)) != -1) {
//这个while这里比较复杂我会比较详细的解释,我们每次是读取1024个字节的数据,假设我们读取到最后
//这个文件没有1024个字节了,比方说它就剩了500字节,那么如果我们把多的那500多个字节也写到指定的文件中去
//那么这里很可能发生文件损坏所以我们就需要用len记录下每次读到的长度。然后写进去
bos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
结果如下: