目录
2.2、字节缓冲流输出流(BufferedOutputStream)构造方法演示
2.3、字节缓冲流输出流(BufferedOutputStream)写方法
2.4、字节缓冲流输入流(BufferedInputStream)构造方法演示
3.3、BufferedReader特有方法readLine()
引言
在我的上个文章中讲述了字节、字符流,本章讲述它们的升级版——字节、字符缓冲流,本次的缓冲流在效率上要比字节、字符流高出很多。
1、缓冲流的概述
缓冲流,也叫高效流,是对4个基本的`FileXxx` 流的增强,所以也是4个流,按照数据类型分类
通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。下面就是缓冲流的两个类:
写数据:BufferedOutputStream
读数据:BufferedInputStream
1.1、缓冲流的分类
名称 | 类 |
---|---|
字节缓冲流 | BufferedInputStream BufferedOutputStream |
字符缓冲流 | BufferedReader BufferedWriter |
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
2、字节缓冲流
2.1、字节缓冲流构造方法
方法名 | 说明 |
---|---|
public BufferedInputStream(InputStream in) | 创建一个 新的缓冲输入流。 |
public BufferedOutputStream(OutputStream out) | 创建一个新的缓冲输出流。 |
2.2、字节缓冲流输出流(BufferedOutputStream)构造方法演示
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//相当于把字节流进行了一次装
FileOutputStream fos = new FileOutputStream("a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//简单写法
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
//也可以进行追加
BufferedOutputStream bos = new BufferedOutputStream(new
FileOutputStream("a.txt",true));
}
}
2.3、字节缓冲流输出流(BufferedOutputStream)写方法
public class BufferedOutputStreamDemo {
public static void main(String[] args) throws IOException {
BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("a.txt",true));
bo.write("\r\n".getBytes());
bo.write("hello".getBytes());
bo.write(98);
byte[] bytes={'w','x','y','t'};
bo.write(bytes,0,2);
bo.close();
}
}
2.4、字节缓冲流输入流(BufferedInputStream)构造方法演示
public class BufferedInputStreamDemo {
public static void main(String[] args) throws FileNotFoundException {
File file=new File("a.txt");
FileInputStream fi=new FileInputStream(file);
BufferedInputStream b=new BufferedInputStream(fi);
BufferedInputStream bi=new BufferedInputStream(new FileInputStream("a.txt"));
}
}
2.5、字节缓冲流输入流读方法
public class BufferedInputStreamDemo1 {
public static void main(String[] args) throws IOException {
BufferedInputStream bi=new BufferedInputStream(new FileInputStream("a.txt"));
int b;
//一次读一个字节
while((b=bi.read())!=-1){
System.out.println((char)b);
}
bi.close();
}
}
public class BufferedInputStreamDemo2 {
public static void main(String[] args) throws IOException {
BufferedInputStream bi=new BufferedInputStream(new FileInputStream("a.txt"));
byte[] bytes=new byte[1024];
int len;
//一次读一个字节数组
while((len=bi.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
bi.close();
}
}
2.6、字节缓冲流复制文件
public class BufferedCopy {
public static void main(String[] args) throws IOException {
BufferedInputStream bi=new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("b.txt"));
byte[] bytes=new byte[1024];
int len;
while((len=bi.read(bytes))!=-1){
bo.write(bytes,0,len);
}
bi.close();
bo.close();
}
}
3、字符缓冲流
3.1、字符缓冲流的构造方法
方法名 | 说明 |
---|---|
public BufferedInputStream(InputStream in) | 创建一个 新的缓冲输入流。 |
public BufferedOutputStream(OutputStream out) | 创建一个新的缓冲输出流。 |
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//相当于把字节流进行了一次装
FileOutputStream fos = new FileOutputStream("a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//简单写法
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
//也可以进行追加
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt",true));
}
}
3.2、字节缓冲输出流(BufferedReader)
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
char[] chars=new char[1024];
int len;
//一次读一个字符数组
while((len=br.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
br.close();
}
}
3.3、BufferedReader特有方法readLine()
public class BufferedReaderDemo1 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
//一次读一行数据
String s = br.readLine();
System.out.println(s);
br.close();
}
}
3.4、字节缓冲输入流(BufferedWriter)
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
BufferedWriter writer=new BufferedWriter(new FileWriter("a.txt",true));
writer.write("hello");
writer.write(97);
writer.write(98);
writer.close();
}
}
3.5、BufferedWriter有方法
public class BufferedWriterDemo1 {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt",true));
bw.write(98);
bw.write(99);
//写一行行分隔符,由系统属性定义符号
bw.newLine();
bw.close();
}
}
3.6、字符缓冲流复制
public class Copy {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("c.txt"));
char[] chars=new char[1024];
int len;
//一次读取一个字符数组
while((len=br.read(chars))!=-1){
//写操作
bw.write(chars,0,len);
//刷新操作
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
4、字节、字符流和字节、字符缓冲流的效率区别
字节流四种方式复制文件(这里以一个34M的视频文件为例,代码不再展示):
基本字节流一次读写一个字节: 共耗时:117235毫秒
基本字节流一次读写一个字节数组: 共耗时:156毫秒
高效字节流一次读写一个字节: 共耗时:1141毫秒
高效字节流一次读写一个字节数组: 共耗时:47毫秒由此可见:缓冲流的效率是比基本流的效率高的多的。