文件I/O
来源:互联网 发布:mac怎么下载2个qq 编辑:程序博客网 时间:2024/06/06 01:36
存储的两种状态
序列化
纯文本文件
如果只有自己的Java程序用数据:序列化
可能被其他程序引用:纯文本文件
接口 Serializable来自 java.io.*;
创建FileOutputStream :这是连接文件的,较底层
FileOutputStreamfileStream = new FileOutputStream("MyGame.ser");
创建ObjectOutputStream ;把对象层次转换串流级别记入FileOutputStream。
ObjectOutputStreamos =new ObjectOutputStream(fileStream);
调用方法写入对象
os.writeObject(characterOne);//也就是把变量引用的对象序列化并写入MyGamer.set文件
os.writeObject(characterTwo);
os.writeObject(characterThree);
关闭ObjectOutputStream
os.close();//关闭关联的输出串流-----------------------------
应该注意到,串流要两两连接才能有意义(FileOutputStream和ObjectOutputStream),这其中一个表示连接,另一个调用方法。至于为什么是两个?连接的串流一般是很低层的。FileOutputStream有写入字节的方法。但我们一般不会直接写字节,而是以对象层次的观点来操作,所以需要高层连接串流ObjectOutputStream与FileOutputStream连接。
FileOutputStream把字节写入文件。ObjectOutputStream把对象转换成可以写入串流的数据。调用writeObject时对象会被打成串流送入FileOutputStream来写入文件。
另外值得注意的是以上语句可能会抛出异常所以应该放置在try{}里
同一个类的不同对象的区别的关键在于其实例变量的不同(那么当然你需要保存实例变量)。所以在对象被序列化时,被该对象引用的实例变量也会序列化,且引用的对象也会序列化,这些是自动进行的。
上述也提到一个问题是其引用的对象会一同序列化,是所以引用到的。
类可以被序列化需要实现接口 Serializable
这时也要注意到你需要在所有可能用到的类中实现参考上言。序列化的类要实现接口,其中引用到了其他对象那么也要实现。
如果实例变量不能或者不应序列化标记为 teansient(瞬时)这样会跳过它进行序列化
解序列化(Deserializtion):还原对象
创建FileInputStream连接文件
FileInputStreamfileStream = new FileInputStream("MyGame.ser");
创建ObjectInputStream
用来读取对象,但是需要链接FileInputStream提供文件存取
ObjectInputStream os =new ObjectInputStream(fileStream);
读取对象
Object one = os.readObject();
Object two = os.readObject();
Object three = os.readObject();
转换对象类型(默认Object)
GameCharacterelf = (GameCharacter) one;
GameCharactertroll = (GameCharacter) one;
GameCharactermagician = (GameCharacter) one;
关闭ObjectInputStream
os.close();
解序列化时,
对象从stream中读出来,虚拟机会判断其class类型;
Jvm寻找其类并加载,如果找不到会抛出异常;
新对象被配置在堆上,但注意新对象的构造方法不会执行,因为构造方法会将对象恢复全新,我们想要的是对象的状态是此前储存的;
如果对象的继承树上某个祖先类不可序列化,则它在构造时的构造函数会执行,显然构造函数的递归性会连锁讲其以上的父类全部初始化;
被transient修饰的变量会被赋予默认值。
阅读全文
0 0
- 文件I/O与标准I/O
- 标准I/O、文件I/O
- 文件I/O与标准I/O
- 异步文件 I/O
- 多媒体文件I/O
- 文件I/O
- 文件I/O操作
- 文件I/O操作
- 文件I/O操作
- 文件I/O
- I/O文件库
- 文件I/O
- 文件I/O
- 文件I/O
- 高级文件I/O
- unbuffered 文件I/O
- unix----文件I/O
- 文件I/O
- CnetOS 7 安装Pycharm
- DescriptionResourcePathLocationType cvc-complex-type.2.4.a: Invalid content was found starting w
- 预览要设置窗体大小的实例
- rsyslog 入门 第六篇 关于多行 \n 问题
- 从SSH不能被wireshark解析来看linux的自虐和浮躁
- 文件I/O
- shell中的各种括号的使用方法
- 自动化工具expect的搭建和简单使用
- NOIP2012 同余方程
- Netty 解决粘包拆包问题
- JS处理字符串为首字母大写
- Spline算法:输入几个点,输出一条曲线的点。
- vue.js之组件
- java -jar 执行jar包出现 java.lang.NoClassDefFoundError