一.序列化和反序列化
* 序列化:指的是把堆内存中的java对象(自定义的对象)数据,通过某种方式把对象存储在磁盘文件中或者
* 传递给其他网络的节点(在网络上传输),我们把这个过程称之为序列化
* 反序列化:把磁盘文件中的对象数据或者把网络节点上的对象恢复成java对象的过程
*
* 为什么要进行序列化:
* 1):在分布式系统中,需要共享的数据的JavaBean对象,都得做序列化,此时需要把对象在网络上
* 传输,此时就得把对象数据转换为二进制形式. 以后存储在HttpSeesion中的对象,都应该实现
* 序列化接口(只有实现序列化接口,才能做序列化操作);
*
* 2):服务钝化如果服务器发现某些对象好久没有活动了,此时服务器就会把这些内存中的对象,持久
* 化在本地磁盘文件中(java对象--->二进制文件)
* 如果某些文件需要活动的时候,先在内存中去找,找到就使用,找不到就到磁盘文件中找,反序列
* 化可以将我们的对象数据,恢复为java对象
*
* 需要做序列化的对象的类,必须实现序列化接口,java.lang.Serializable接口
* Serializable接口是标志接口,没有抽象方法
* 底层一般会判断,如果当前对象时Serializable接口的实例才允许做序列化
*
* 在java中大多数类已经实现了Serializable接口
二.对象流
//利用对象流来完成序列化和反序列化
* ObjectOutputStream:通过WriteObject方法做序列化操作的
* ObjectInputStream:通过ReaderObject方法做反序列化操作的
*
* 对象流的构造方法:
* public ObjectOutputStream(OutputStream out):创建写入指定 OutputStream 的 ObjectOutputStream
throws IOException
public ObjectInputStream(InputStream in):创建从指定 InputStream 读取的 ObjectInputStream
throws IOException
*
* 方法:
* public final Object readObject():从 ObjectInputStream 读取对象
throws IOException, ClassNotFoundException
public final void writeObject(Object obj):将指定的对象写入 ObjectOutputStream
throws IOException
*/
//序列化后,存进文件中的内容是乱码的,需要反序列化才能看到
//需要做序列化的对象的类,必须实现序列化接口,java.lang.Serializable接口
三.对象流操作细节和serialVersionUID
* 序列化的细节序列化的版本:
* 1):如果某些数据不需要做序列化,比如密码,此时该咋么办?
* 理论上来说静态的字段和瞬态的字段是不能序列化,有静态修饰,则意味着相当一个类,而不是对象
*
* 解决方案:
* transient private String passedword;
*
* 2):序列化的版本问题:
* 反序列化java对象时必须提供该对象的字节码(class)文件,现在的问题是,随着项目的升级,系统
* 的class文件也会升级(比如说增加一个字段/删除一个字段),此时的字节码文件就会改变,从而无
* 法进行反序列化
* 所以要显示serialVersionUID常量,如果不显示定义serialVersionUID类变量,该类变量的值
* 由JVM根据类相关信息计算,而修改后的类的计算方式往往和以前的不同,从而造成了对象反序列化,
* 因为版本不兼容而失败的问题
*
* 解决方案:
* 在类中提供一个固定的serialVersionUID
四.打印流
* 打印流,打印数据的,打印流只能是输出流
* printStream 字节打印流
* 构造方法:
* public PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。
throws FileNotFoundException
* printWriter 字符打印流
* public PrintWriter(OutputStream out,boolean autoFlush) :通过现有的 OutputStream
* 创建新的 PrintWriter,此便捷构造方法创建必要的中间 OutputStreamWriter
* 对于printWriter来说,当启动自动刷新后 ,即boolean值为true
* printWriter ps=new printWriter(new FileOutputStream(new File("out.txt")),true)
* 然后调用println,printf或者format方法,便会立马刷新操作
*
* 自动刷新的两个必要条件:
* 1).构造方法中必须带 true
* 2).必须有println,printf或者format方法
* 如果没有自动刷新或者使用print输出的则需要手动刷新
*
*/
//不管它是字节打印流还是字符打印流,后面都加上close()方法,让其刷新
五.标准IO操作
标准的输入:通过键盘录入数据给程序
* 标准的输出:在屏幕上显示程序数据
*
* System类中的两个常量:
* InputStream in=System.in;
* printStream out=system.out;
*
* 标准的流的重定向操作:
* 标准的输入:通过键盘录入数据给程序
* 重新指定输入的源不再是键盘,而是一个文件
* static void setln(InputStream in)重新分配"标准"输入流
* 此后,System.in数据的来源就是setln指定的源
*
* 标准的输出:在屏幕上显示程序数据
* 重新指定输出的目标不再是屏幕.而是一个文件
* static void setout(PrintStream out)重新分配"标准"输出流
六.扫描器类Scanner
七.配置文件
* 配置文件:资源文件(以.properties作为拓展名的文件)/属性文件
*
* 做项目开发,为何使用配置文件?
* 把所有的数据存储在代码,写死了.叫做"硬代码"
* 比如:在java中需要连接数据库,必须拥有数据的账号和密码
* 此时,我们就得在java代码中编写类似的代码:
* String username="root";
* String password="admine";
* 代码程序运行OK
*
* 但是,以后我们把项目部署在别人的电脑/服务器中,别人的电脑中数据库的账号和密码
* 不在是root和admine,此时我们就得去项目中到处去找使用了账号和密码的地方
* 部署项目的是实施人员,为了安全操作,不能直接让其修改代码
* 此时,我们专门为数据库提供一个配置文件,里面专门存储数据库连接相关的信息
*
* -----------------------------------------------------------------------
* 建立 db.properties(文件)
* -----------------------------------------------------------------------
//配置文件中的内容
* #key=value;
* username=root;* password=admine;
* .........
*/
// 现在数据库的连接信息在db.properties文件中,而java代码需要获取该文件中的信息
//
// 重心转移:java代码如何加载properties文件,如何获取该文件中的数据
// 必须使用properties类(Hashtable的子类,Map接口的实现类),也是一种集合
八.随机访问文件
//随机访问文件(RandomAccessFile):表示可以在该文件的任何位置写出和读取数据
//该类中同时包含读和写两种方法,属于雌雄同体
//文件指针
* 构造方法 :
RandomAccessFile(File file, String mode) :创建从中读取和向其中写入(可选)的随机访问文件流,
该文件由 File 参数指定
mode:有常见的两种状态 "r" 只读;"rw" 即可读又可写
* 方法:
* public void seek(long pos) :设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
throws IOException
//RandomAccessFile经常用来使用多线程断点使用
//1.多线程
//2.断点使用
九.UIO 2.0_文件的拷贝(UIO中的部分内容)