java核心内库---IO(3)

一.序列化和反序列化

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值