bufferedoutputstream乱码_对象流如何写出到文件以及为什么乱码

在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考。

首先需要理解好IO流是如何处理文件的。

1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是文本数据,

所以,该数据保存到文件中,用文本编辑器打开,必然是乱码。

2.输出流,在写入之后,一般都会调用flush方法,将缓冲区的数据刷到IO中去

(当然,楼主的目的地是硬盘文件中)。IO读写,一般情况下,操作系统也会建立一定大小的缓冲区。

3.输出流,在所有写入操作都做完后,应该关闭IO流,调用close方法。

除了可以回收系统资源外,也会强制刷新系统缓冲区中的数据至硬盘。

4.object_in引用对应的是输入流对象,流是流动的,当你上面写入一个对象到文件中后,

下面就只能从那个文件中读取一个对象,再调用读取方法,什么也读不到。

所以,System.out.println(object_in.readObject());的参数应该是li。

5.输入流在读取完成后,也要进行关闭,回收系统资源。

同时一定要记得关闭资源

最后,针对之前说的乱码问题,我上面已经说明了,

各位应该仔细理解Java对象的序列话操作到底干了什么。

它不是简单的把对象属性值写入IO流中,而是按照一定的数据格式写入的。

而这种格式,不是记事本、写字板、Word等文本编辑器能够识别的,

因为,这些数据,压根就不是文本数据。

只有使用相同版本的Java的ObjectInputStream来进行读取操作。

并且,流数据,在没有缓冲区的情况下,是不能读取重复数据的。

也就是说,如果,我的文本文件中,存放12345这五个字符,

那么,我用流读取一个字符,第一个是字符1,第二次读取,必然是字符2,

不可能还是字符1,除非你用带缓冲区缓的流对象,这样,你在读取前先做标记,

读取完了,可以回退到标记处,重复读取数据,

当然,数据的当前位置和标记位置之间的距离不能超过缓冲区的大小。

package cn.jd.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
/*
 * 对象流:
 * 1先写出后读取
 * 2读取的顺序和写出保持一致
 * 3不是所有的对象都可以序列化Serializable
 */
public class ObjectTest3 {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		ObjectOutputStream oos=
				new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("obj.ser")));
		oos.writeUTF("我太难了");
		oos.writeInt(18);
		oos.writeBoolean(false);
		//加入对象
		oos.writeObject("希望世界和平");
		oos.writeObject(new Date());
		Employee emp=new Employee("小二",400);
		oos.writeObject(emp);
		oos.flush();
		oos.close();
		  
		ObjectInputStream ois=
				new ObjectInputStream(new BufferedInputStream(new FileInputStream("obj.ser")));
		 String msg=ois.readUTF();
		 int age=ois.readInt();
		 boolean flag=ois.readBoolean();
		 Object str=ois.readObject();
		 Object date=ois.readObject();
		 Object employee=ois.readObject();
		 //接下来我们就将类型还原,这里我们必须加上类型转换
		 if(str instanceof String) {
			 String strObj=(String)str;
//			 System.out.println(strObj);
		 }
		 if(date instanceof Date) {
			 Date dateObj=(Date)date;
//			 System.out.println(dateObj);
		 }
		 if(employee instanceof Employee) {
			Employee empObj=(Employee)employee;
			 System.out.println(empObj.getName()+"-->"+empObj.getSalary());
		 }
//		 System.out.println(msg);
		 ois.close();
		 
		 
		 
		 
	}
}
b7698a024cfea7bf6bc9a4e427bff2b2.png
https://www.zhihu.com/video/1229752143528869888
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值