BufferedInputStream 缓冲字节输入流
类的关系图:
缓冲流,那何为缓冲呢?
其实就是在内存中开辟一块了缓冲区,因为内存的读写速度比硬盘要高得多,因此它可以做到提升读取速率的功能
原理图
构造方法
//缓冲流就是加强流,是对普通流的加强
BufferedInputStream(InputStream in) 创建缓冲字节输入流,参数为基本的字节输入流
BufferedInputStream(InputStream in,int size) 创建缓冲字节输入流对象,可以指定缓冲区的大小
我们知道字节缓冲流,主要是在内存中开辟了一块缓冲区。在实际的传输中使用的还是底层的普通的字节流,因此构造方法传递的参数还是字节流对象。
BufferedInputStream对象的创建示例:
//创建方法1(一般不用,太麻烦)
File file = new File("D:\\www\\abc.txt");
InputStream fi = new FileInputStream(file);
BufferedInputStream buffer1 = new BufferedInputStream(fi);
//创建方法2,比较常用
BufferedInputStream buffer2 = new BufferedInputStream(new FileInputStream("D:\\www\\abc.txt"));
BufferedInputStream读数据的方式
read方法以及返回值分析
因为它的构造方法传递是一个普通的字节输入流因此read方法的使用与FileInputStream类中读的方法是一致的
read() //一次读取一个字节
read(byte[] ch) //一次读取一个字节数组
read(byte[] ch , int off,int length) //一次读取一个字节数组,设置偏移量,以及读取字节的长度
因为read方法和FileInputStream类的读取方法一致,所以不做详细介绍,可以参照:FileInputStream类的详细介绍
直接演示一下代码吧,控制台打印:
import java.io.*;
public class Text_缓冲字节流的练习 {
public static void main(String[] args)throws Exception {
//文件内容为:aabbcc我
File file = new File("D:\\www\\text.txt");
read(file); //调用读取文件的方法1
/*
输出结果:aabbcc??
//出现乱码是因为我的文本文件中有一个中文字符'我',
它是两个字节,那么我们一次读取一个字节的话就强行把它拆开导致乱码
*/
}
//使用缓冲字节输出流来实现文件读取的功能
public static void read(File file)throws Exception {
InputStream in = new BufferedInputStream(new FileInputStream(file));
//一次读取一个字节
int len;
while((len = in.read()) != -1) {
System.out.print((char)len);
}
in.close();
}
//定义一个方法使用缓冲字节流读取文件(一次读取一个字节数组)
public static void readByte(File file) throws Exception{
//使用多态的方式,简化创建BufferedInputStream对象
InputStream in2 = new BufferedInputStream(new FileInputStream(file));
byte[] bytes = new byte[2];
int len;
while((len = in2.read(bytes)) != -1){
System.out.print(new String(bytes,0,len)); //将字节数组转换为字符串,打印在控制台。
}
in2.close(); //读取结束,释放资源!
}
}
//输出结果:aabbcc我
//这里没有出现乱码原因:
//一次读取两个字节分别是aa bb cc 我 此时的我刚好两个字节所以没有出现乱码
BufferedInputStream使用方法和FileInputStream类的使用一模一样,它只是普通字节输入流的加强版。
原创内容若存在错误请联系我哦,分享快乐,分享知识!