IO流(三)
2023-12-14 23:11:58
目录
一.缓冲流
基本知识
缓冲流是高级流,是对基本流进行了包装
缓冲流的底层自带了长度为8192的缓冲区来提高性能
底层真正起到作用的还是基本流
1.字节缓冲流
代码书写大同小异
构造参数里面去关联基本流
?
//创建缓冲流的对象
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy.txt"));
//循环读取并写道目的地
int b;
while((b=bis.read())!=-1){
bos.write(b);
}
//释放资源
bos.close();
bis.close();
这里面只需要关闭缓冲流,就不需要关闭基本流了,因为在缓冲流的底层代码中,自动关闭基本流
利用数组一次读取多个字节
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("b.txt"));
//利用数组一次读取多个字节
//最好是1024的整数倍
byte []bytes=new byte[1024];
int len;
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
//释放资源
bos.close();
bis.close();
对于缓冲流提高效率的原理
字节缓冲输入流和字节缓冲输出流都有缓冲区
缓冲流提速的根本原因就是提高了内存与硬盘之间的数据传输速度
内存之间的缓冲流传递非常快
2.字符缓冲流
字符缓冲流特有的方法
//创建对象
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
//读取一整行 遇到回车换行就会结束 但是不会读取回车换行
String s = br.readLine();
System.out.println(s);
//关流
//创建对象
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
//循环读取
String s;
while((s=br.readLine())!=null){
//readLine如果读取完毕,则返回值是null
System.out.println(s);
}
//关流
br.close();
?总结
二.转换流
转换流是关联字符流和字节流之间的桥梁
1.指定字符集读取
//指定字符集读取数据
FileReader fr=new FileReader("a.txt", Charset.forName("GBK"));
//读取数据
int ch;
while((ch=fr.read())!=-1){
System.out.println((char) ch);
}
//关流
fr.close();
2.转换
//将UTF-8转换为GBK
//创建转换流 关联文件并且指定字符集
FileReader fr=new FileReader("a.txt",Charset.forName("UTF-8"));
FileWriter fw=new FileWriter("c.txt",Charset.forName("GBK"));
int len;
while((len=fr.read())!=-1){
fw.write(len);
}
//关流
fw.close();
fr.close();
总结
三.序列化流和反序列化流
1.序列化流可以把java的对象写到本地文件中
Serializable接口是一个标记型接口
一旦实现了这个接口表示该类可被序列化
//创建对象
Student stu=new Student("zahngsan",555);
//创建序列化流的对象
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt"));
//写出数据
oos.writeObject(stu);
//释放资源
oos.close();
2.反序列化流
把序列化流在本地文件的对象读出来
//创建反序列化流对象
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
//读取数据
Object o=ois.readObject();
//打印对象
System.out.println(o);
//释放资源
ois.close();
transient关键字,在属性前面加上就不会被序列化
文章来源:https://blog.csdn.net/Ineedmame/article/details/135001728
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!