当前位置: 首页 > news >正文

Java后端开发day43--IO流(三)--缓冲流转换流序列化流

请添加图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

请添加图片描述

缓冲流

请添加图片描述

1. 字节缓冲流

原理:底层自带了长度为8192的缓冲区提高性能
请添加图片描述

1.1拷贝文件(一次读写一个字节)

//1.创建缓冲流的对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myio\\a.txt"));
BufferedOutputStream bos = new Buffered0utputStream(new File0utputStream("myio\\copy.txt"));
//2.循环读取并写到目的地 
int b;
while ((b = bis.read()) != -1){bos.write(b);
}
//3.释放资源 
bos.close();
bis.close( );

1.2 拷贝文件(一次读写一个字节数组)

//1.创建缓冲流的对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myio\\a.txt"));
BufferedOutputStream bos = new Buffered0utputStream(new File0utputStream("myio\\copy2.txt"));
//2.拷贝(一次读写多个字节)
byte[] bytes = new byte[1024]; 
int len;
while((len = bis.read(bytes)) != -1){bos.write(bytes, 0, len);
}	I	
//3.释放资源 
bos.close(); 
bis.close();

1.3 提高效率的原理

请添加图片描述
请添加图片描述

2. 字符缓冲流

原理:底层自带了长度为8192的缓冲区提高性能
请添加图片描述

2.1 方法

请添加图片描述
请添加图片描述

2.2 使用

  • 输入
//1.创建字符缓冲输入流的对象
BufferedReader br = new BufferedReader(new FileReader("myio\\a.txt"));
//2.读取数据//细节:
//readLine方法在读取的时候,一次读一整行,遇到回车换行结束
//	但是他不会把回车换行读到内存当中	
/*String line1 = br.readLine();	
System.out.println(line1);
String line2 = br.readLine(); 
System.out.println(line2);*/
String line;
while ((( line = br.readLine()) != null)){System.out.println(line);
}
//3.释放资源 
br.close();
  • 输出
//1.创建字符缓冲输出流的对象
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt", true));
//2.写出数据
bw.write( str:"123"); 
bw.newLine( );|
bw.write( str: "456" ); 
bw.newLine();
//3.释放资源 
bw.close();

转换流

是字符流和字节流之间的桥梁。
请添加图片描述
请添加图片描述

1. 利用转换流按照指定字符编码读取

/*利用转换流按照指定字符编码读取(了解)
因为JDK11:这种方式被淘汰了。替代方案(掌握)*///1.创建对象并指定字符编码
/*
InputStreamReader isr = new InputstreamReader(new FileInputStream("myio\\gbkfile.txt"),"GBK");
//2.读取数据 int ch;
while ((ch = isr.read()) !=-1){
System.out.print((char)ch);}
//3.释放资源 isr.close();
*/FileReader fr = new FileReader("myio\\gbkfile.txt",Charset.forName("GBK"));
//2.读取数据 
int ch;
while ((ch = fr.read()) != -1){System.out.print((char)ch);}
//3.释放资源 
fr.close();

2. 利用转换流按照指定字符编码写出

/*利用转换流按照指定字符编码写出*/
//1.创建转换流的对象
/*OutputStreamWriter osw = new outputStreamWriter(new File0utputStream("myio\\b.txt"),"GBK");
//2.写出数据
osw.write("你好你好");
//3.释放资源 
osw.close();*/FileWriter fw = new FileWriter("myio\\c.txt",Charset.forName("GBK")); 
fw.write( str:"你好你好"); 
fw.close();

3. 将本地文件中的GBK文件,转成UTF-8

/*将本地文件中的GBK文件,转成UTF-8*///1.JDK11以前的方案
/* InputstreamReader isr = new InputstreamReader(new FileInputstream("myio\\b.txt"),"GBK"); 
outputstreamWriter osw = new outputstreamWriter(new FileOutputStream("myio\\d.txt"),"UTF-8");
int b;
while((b = isr.read()) != -1){
osw.write(b);
}
osw.close( );| isr.close();*///2.替代方案
FileReader fr = new FileReader("myio\\b.txt",Charset.forName("GBK")); 
FileWriter fw = new FileWriter("myio\\e.txt",charset.forName("UTF-8")); 
int b;
while ((b = fr.read()) != -1){fw.write(b);}
fw.close();

序列化流(对象操作输出流)

可以把Java中的对象写到本地文件中
请添加图片描述

1. 方法

请添加图片描述

/*
需求:
利用序列化流/对象操作输出流,把一个对象写到本地文件中
构造方法:
public 0bjectOutputStream(OutputStream out)	把基本流变成高级流	
成员方法:
public final void write0bject(0bject obj)	把对象序列化(写出)到文件中去	
*/
//1.创建对象
Student stu = new Student("zhangsan", 23);
//2.创建序列化流的对象/对象操作输出流
0bject0utputStream oos = new 0bject0utputStream(new File0utputStream("myio\\a.txt"));
//3.写出数据
oos.write0bject(stu);
//4.释放资源 
oos.close();

2. 细节

Serializable接口里面是没有抽象方法,标记型接口
一旦实现了这个接口,那么就表示当前的Student类可以被序列化
理解:

  • 一个物品的合格证
    请添加图片描述

反序列化流(对象操作输入流)

可以把序列化到本地文件中的对象,读取到程序中来

1. 方法

请添加图片描述

/*需求:
利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中构造方法:
public ObjectInputStream(InputStream out)	把基本流变成高级流	
成员方法:
public 0bject read0bject( )	把序列化到本地文件中的对象,读取到程序中来	
*///1.创建反序列化流的对象
0bjectInputStream ois = new 0bjectInputStream(new FileInputStream("myio\\a.txt"));
//2.读取数据
0bject o = ois.read0bject();
//3.打印对象
System.out.print1n(o);
//4.释放资源 
ois.close();

2. 细节

  1. 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。
    否则,会出现NotSerializableException异常
  2. 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
  3. 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?
    会出问题,会抛出InvalidClassException异常
    **解决方案:**给Javabean类添加serialVersionUID(序列号、版本号)
  4. 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
    **解决方案:**给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
http://www.xdnf.cn/news/329923.html

相关文章:

  • 如何在本地测试网站运行情况
  • Kubernetes生产实战:容器内无netstat时的7种端口排查方案
  • 如何理解参照权
  • 如何设置飞书多维表格,可以在扣子平台上使用
  • Python办公自动化应用(三)
  • 备注在开发中的重要作用
  • MySQL数据库高可用(MHA)详细方案与部署教程
  • 国标GB28181视频平台EasyGBS打造电力行业变电站高效智能视频监控解决方案
  • 统计匹配的二元组个数 - 华为OD机试真题(A卷、JavaScript题解)
  • 宝塔面板,删除项目后还能通过域名进行访问
  • 从人脸扫描到实时驱动,超写实数字分身技术解析
  • Go语言中的并发编程--详细讲解
  • 【赵渝强老师】TiDB的备份恢复策略
  • 将本地项目提交到新建的git仓库
  • 【性能工具】一种简易hook bitmap创建的插件使用
  • Docker + Watchtower 实现容器自动更新:高效运维的终极方案
  • 算法研习:最大子数组和问题深度剖析
  • YOLO-POSE 姿态扩充
  • CUDA:out of memory的解决方法(实测有效)
  • 心智领航・数启未来 | AI数字化赋能精神心理医疗学术大会重磅来袭,5月10日广州附医华南医院开启智慧对话!
  • 【C++贪心】P9344 去年天气旧亭台|普及
  • Spark处理过程-转换算子和行动算子
  • NumPy 2.x 完全指南【一】简介
  • 混淆矩阵(Confusion Matrix)
  • Qt开发经验 --- 避坑指南(5)
  • python打卡day18
  • Spring MVC中跨域问题处理
  • 把一个过大的文件夹分成若干个 ZIP 分卷
  • 雅努斯问题(Janus Problem)及解决方案
  • 三轴云台之模糊控制算法篇