Java之BufferedInputStream

本文详细介绍了Java中的BufferedInputStream,包括缓冲区的操作和提高效率的原理。同时,讲解了字符流的概念,以Reader和Writer为父类的字符流如何与字节流配合,特别是转换流InputStreamReader和OutputStreamWriter在字节流与字符流之间的转换作用。此外,还讨论了文件缓冲流的读取、对象输入流的反序列化等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、缓冲流的缓冲区操作
将缓冲流连接在文件流可以提高效率,缓冲流实际上本质就是进行块读写,无论我们是使用缓冲流进行何种读写方式,最终都会被缓冲流转换为快读写形式通过文件流进行实际操作。
缓冲流内部维护了一个8K的字节流,用于块读写操作。
BufferedInputStream:输入缓冲流;
BufferedOutputStream:输出缓冲流
缓冲流提供了一个强制写出数据的方法:flush();

//文件输出流
FileOutputStream fos = new FileOutputStream("bos.txt",true);
//文件输出缓冲流
BufferedOutputStream bos = new BufferedOutputStream(fos);
String str = "人非要经历一番不同平时的劫难才能脱胎换骨,成为真正能解决问题的人";
byte[] bytes = str.getBytes("UTF-8");
bos.write(bytes);
bos.flush();//强制将当前缓冲区数据写出
bos.close();//缓冲close()时会调用flush()

2、字符流
java将流按照读写单位划分为字节流和字符流
InputStream和OutputStream是所有字节流父类,而java.io.Reader和java.io.Writer是字符流的父类。
字符流知识方便我们读写字符,底层本质还是读写字节,知识字节和字符的转换,工作交给了转换流来完成。
转换流:
java.io.InputStreamReader
java.io.OutputStreamWriter
java提供的其他高级字符流都有一个特点就是只能连接在其他字符流上,但通常低级流都是字节流。这个就导致字符流不能直接搭配字节流使用,但是转换流例外;他们本身就是字符流,而他们又可以连接字节流,所以在实际开发中当我们使用高级的字符流时,通常与字节流连接时需要使用转换流,它起到了“承上启下”的作用,也就是“将字符转换为字节”的功能。
OutputStreamWriter构造方法中OutputStreamWriter(OutStream out)、InputStreamReader(InputStream in);
OutputStreamWriter(OutStream out,String charset)
InputStreamReader(InputStream in,String charset);
charset:编码格式

//输出字节流
FileOutputStream fos = new FileOutputStream("osw.txt");
//输出转换流
OutputStreamWriter osw = new OutputStream(fos,"UTF-8");
String str = "窗前明月光";
osw.writer(str);
osw.writer("疑是地上霜");
System.out.println("写入完毕!");
osw.close();

3、复制音乐

//输入流
FileInputStream fis = new FileInputStream("C:/user/001.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
//输出流
FileOurputStream fos = new FileOutputStream("C:/user/01.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len = -1;
long time1 = System.currentTimeMillis();
while((len=bis.read())!=-1){
	bos.writer(len);
	bos.flush();
}
long time2  = System.currentTimeMillis();
System.out.println("复制完毕!");
System.out.println("耗时"+(time2-time1));
bis.close();
bos.close();

4、文件缓冲流读取

FileInputStream fis = new FileInputStream("bos.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] data = new byte[200];
int len = fis.read(data);
String str = new String(data,0,len,"UTF-8");
System.out.println(str);
bis.close();

5、缓冲字符输入流

//输出字节流
FileInputStream fis = new FileInputStream("pw2.txt");
//输入转换流
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
//输出字符流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("pw2.txt"),"UTF-8"));
/*
* BufferedReader提供了String readLine()方法;
* 连续读取若干字符,直到读取到换行符尾部,然后将换行符之前读取的字符姨一个字符串的形式返回。注意,返回字符串中不含有最后读到的换行符,若返回值为null,则表示读到末尾
*/
String line = null;//每一行读到的数据
while((line = br.readLine())!=null){
	System.out.println(line);
}

6、文件输入流

FileInputStream fis = new FileInputStream("fos.txt");
byte[] bytes = new bytes[200];
int len = fis.read(bytes);
/**
* new String(bytes,0,len,"UTF-8");
* bytes:读取bytes数组;
* 0:从下标0开始读取
* len:截止到实际读取到的字节量
* “UTF-8”:以“UTF-8”编码读取
*/
String str = new String(bytes,0,len,"UTF-8");
System.out.println(str);
fis.close();

7、利用转换流读取字符

//输入字节流
FileInputStream fis = new FileInputStream("osw.txt");
bytep[] b = new byte[50];
fis.read(b);
System.out.println(new String(b,"UTF-8"));

//转换输入流
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char[] c = new char[50];
int n = isr.read(c);//实际读到的字符量
System.out.println(c,0,n);
System.out.println(str);
int d = isr.read();
System.out.println((char)d);	//读取的是低16位
int len = -1;
while((len=isr.read())!=-1){
	System.out.println((char)len);
}
isr.close();

8、使用对象输入流完成对象“反序列化”

//字节输入流
FileInputStream fis = new FileInputStream("person.obj");
//对象输入流
ObjectInputStream ois = new ObjectInputStream(fis);
//ObjectInputStream提供readObject()返回Object
//Object object = ois.readObject();
Person person = (Person)ois.readObject();//反序列化
System.out.println(person);
ois.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值