一.序列化和反序列化
* 序列化:指的是把堆内存中的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中的部分内容)