疯狂java IO流续~~
来源:互联网 发布:数控铣削编程 编辑:程序博客网 时间:2024/05/16 18:35
Java传统IO的基本体系:
字节输入流 字节输出流 字符输入流 字符输出流
InputStream OutputStream Reader Writer
访问文件 FileXxx
访问数组: ByteArrayXxx CharArrayXxx
访问管道 PipedXxx
访问字符串 StringXxx
过滤流 FilterInputStream FilterOutputStream FilterReader FilterWriter
缓冲流 BufferedXxx
打印流 PrintStream PrintWriter
转换流 InputStreamReader OutputStreamWriter
特殊流 DataInputStream DataOutputStream
ObjectInputStream ObjectOutputStream
RandomAccessFile - 1. 它只能访问文件。相当于DataInputStream和DataOutputStream组合
2. 任意, 由seek(int pos)。
序列化
内存中Java对象 ←→ 二进制流
目的:
A. 在有些时候,需要把对象存储到外部存储器中持久化保存。
B. 有有些时候,需要把对象通过网络传输。
……
■ 可序列化的对象,Java要求序列化的类实现下面任意两个接口:
- Serializable : 接口只是一个标记性的接口,实现该接口无需实现任何方法。
- Externalizable:实现该接口要实现方法。
■ 序列化的IO流:
ObjectInputStream - 负责从二进制流“恢复”对象。readObject
ObjectOutputStream - 负责把对象保存到二进制流中。writeObject
■ 引用变量的序列化机制
A。 引用变量所引用对象的所有属性的类都应该是可序列化的。
B。 序列化的底层机制:
(1) 每序列化一个对象,都会给该对象设置一个编号。
(2) 如果程序第一次序列化某个对象。系统会真的将该对象序列化、并输出。
(3) 如果要序列化的对象是之前已序列化的。此时系统指数输出一个编号。
这种序列化机制,就是为了保存磁盘里的二进制流与内存中的对象是对应的。
■ transient - 修饰符。
用于修饰实例变量。(不能与static同时使用!)
transient 用于执行被修饰的Field不会被序列化。
static修饰的是类变量 - 序列化机制负责序列化实例。
static修饰的类变量存储在类信息中,并不是在存储在对象里
——因此static修饰的类变量不会被序列化!
为什么要用transient ?
对于一些敏感信息,比如银行卡帐号、密码,就不应该被序列化出来,
此时就可以通过transient来修饰这些属性。
■ 完全自定义序列化
对于一些敏感信息,可以使用transient来阻止对它们进行序列化。
但将一些属性完全阻止在序列化之外,有时候也并不完善。
此时可以借助于“定制序列化”, 可以对属性进行一些“加密”。
自定义序列化机制,为序列化类增加如下两个方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
■ 版本号
当我们的类经常时,有时候系统无法确定“反序列化”时的class文件是否还正确。
建议显式为 “可序列化”指定一个版本号。
/* 即使你不指定,系统默认也有一个版本号,但不稳定。 */
serialver.exe - 专门用于查看来类的版本号。
serialver -show : 显示图形化界面。
serialver 完整的类名 :显示指定的类的版本号。
定义版本号,十分简单:
static final long serialVersionUID = 50L;
自定义版本号的好处:更稳定。
只有当我们修改了类定义时,可由程序员显式地控制改变版本号。
Java 7
传统的Java里,只有一个File类,即代表文件,又代表目录。
/** Arrays、Objects、Collections、Paths、Files **/
Path - 接口,代表一个平台无关的目录。
提供了大量的方法来操作目录。
Paths - 工具类。所有方法都是static的。
Files - 操作文件的工具类。
提供了大量的方法来操作文件。
该类所包含的大量方法可能与我们日常一般的期望有些出入。
字节输入流 字节输出流 字符输入流 字符输出流
InputStream OutputStream Reader Writer
访问文件 FileXxx
访问数组: ByteArrayXxx CharArrayXxx
访问管道 PipedXxx
访问字符串 StringXxx
过滤流 FilterInputStream FilterOutputStream FilterReader FilterWriter
缓冲流 BufferedXxx
打印流 PrintStream PrintWriter
转换流 InputStreamReader OutputStreamWriter
特殊流 DataInputStream DataOutputStream
ObjectInputStream ObjectOutputStream
RandomAccessFile - 1. 它只能访问文件。相当于DataInputStream和DataOutputStream组合
2. 任意, 由seek(int pos)。
序列化
内存中Java对象 ←→ 二进制流
目的:
A. 在有些时候,需要把对象存储到外部存储器中持久化保存。
B. 有有些时候,需要把对象通过网络传输。
……
■ 可序列化的对象,Java要求序列化的类实现下面任意两个接口:
- Serializable : 接口只是一个标记性的接口,实现该接口无需实现任何方法。
- Externalizable:实现该接口要实现方法。
■ 序列化的IO流:
ObjectInputStream - 负责从二进制流“恢复”对象。readObject
ObjectOutputStream - 负责把对象保存到二进制流中。writeObject
■ 引用变量的序列化机制
A。 引用变量所引用对象的所有属性的类都应该是可序列化的。
B。 序列化的底层机制:
(1) 每序列化一个对象,都会给该对象设置一个编号。
(2) 如果程序第一次序列化某个对象。系统会真的将该对象序列化、并输出。
(3) 如果要序列化的对象是之前已序列化的。此时系统指数输出一个编号。
这种序列化机制,就是为了保存磁盘里的二进制流与内存中的对象是对应的。
■ transient - 修饰符。
用于修饰实例变量。(不能与static同时使用!)
transient 用于执行被修饰的Field不会被序列化。
static修饰的是类变量 - 序列化机制负责序列化实例。
static修饰的类变量存储在类信息中,并不是在存储在对象里
——因此static修饰的类变量不会被序列化!
为什么要用transient ?
对于一些敏感信息,比如银行卡帐号、密码,就不应该被序列化出来,
此时就可以通过transient来修饰这些属性。
■ 完全自定义序列化
对于一些敏感信息,可以使用transient来阻止对它们进行序列化。
但将一些属性完全阻止在序列化之外,有时候也并不完善。
此时可以借助于“定制序列化”, 可以对属性进行一些“加密”。
自定义序列化机制,为序列化类增加如下两个方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
■ 版本号
当我们的类经常时,有时候系统无法确定“反序列化”时的class文件是否还正确。
建议显式为 “可序列化”指定一个版本号。
/* 即使你不指定,系统默认也有一个版本号,但不稳定。 */
serialver.exe - 专门用于查看来类的版本号。
serialver -show : 显示图形化界面。
serialver 完整的类名 :显示指定的类的版本号。
定义版本号,十分简单:
static final long serialVersionUID = 50L;
自定义版本号的好处:更稳定。
只有当我们修改了类定义时,可由程序员显式地控制改变版本号。
Java 7
传统的Java里,只有一个File类,即代表文件,又代表目录。
/** Arrays、Objects、Collections、Paths、Files **/
Path - 接口,代表一个平台无关的目录。
提供了大量的方法来操作目录。
Paths - 工具类。所有方法都是static的。
Files - 操作文件的工具类。
提供了大量的方法来操作文件。
该类所包含的大量方法可能与我们日常一般的期望有些出入。
- 疯狂java IO流续~~
- [疯狂Java]AWT:位图IO
- 疯狂Java
- 疯狂java
- 疯狂java .....~~~
- 疯狂java
- 疯狂java~~
- Java,IO之FileInputStream和FileReader读取文件(疯狂java讲义)
- Java,IO之FileOutputStream和FileWriter写入文件(疯狂java讲义)
- 疯狂Java学习笔记(54)----------详解Java IO(全面)
- 疯狂的bug【select -IO复用中】
- 疯狂Java实战演义
- 疯狂java 读书笔记
- java疯狂讲义
- 疯狂java讲义codes
- 疯狂Java讲义笔记
- 疯狂java 面向对象~~~
- 疯狂java 手册~~
- 字符串 --- 循环移位问题
- 深入理解JavaScript 模块模式
- C# MessageBox.Show
- 【重点】好用的单例设计模式
- 未分页内存泄露
- 疯狂java IO流续~~
- 第八周项目1-求简分段函数的值
- 正确处理职场人际关系
- c++阅读源代码方法
- UIWebView使用中的内存相关问题
- 在WinForm中使用Membership身份验证(转载)
- 分段函数求值
- SCHED_FIFO与SCHED_RR
- 第八周项目1-求解分段函数的值