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关键字修饰,该关键字标记的成员变量不参与序列化过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值