当前位置: 首页 > 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关键字修饰,该关键字标记的成员变量不参与序列化过程

相关文章:

  • ChromeDriverManager的具体用法
  • 鸿蒙开发Flex也可以用权重
  • Ceph集群OSD运维手册:基础操作与节点扩缩容实战
  • 认识中间件-以及两个简单的示例
  • Linux网络新手注意事项与配置指南
  • Qt开发:枚举的介绍和使用
  • eFish-SBC-RK3576工控板外部RTC测试操作指南
  • SpringBoot项目接入DeepSeek
  • Linux:web服务nginx
  • Pinecone向量库 VS Redis
  • 大模型工具与案例:云服务器部署dify(1)
  • 递归element-ui el-menu 实现无限级子菜单
  • Nginx 搭建支持多版本和前端路由的静态网站
  • 初始图形学(7)
  • C++并发编程完全指南:从基础到实践
  • 准确---Typora配置Gitee图床并实现自动图片上传
  • Windows环境下maven的安装与配置
  • 实践003-Gitlab CICD编译构建
  • 隐私计算技术及其在数据安全中的应用:守护数据隐私的新范式
  • python 闭包获取循环数据经典 bug
  • 华泰柏瑞基金总经理韩勇因工作调整卸任,董事长贾波代为履职
  • 外交部:习近平主席同普京总统达成许多新的重要共识
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书
  • 明星同款撕拉片,为何能炒到三四百一张?
  • 异域拾异|大脚怪的形状:一项神秘社会学研究
  • 复旦发文缅怀文科杰出教授裘锡圭:曾提出治学需具备三种精神