day28—IO 3

3 篇文章 0 订阅
  1. 序列化和反序列化:
    序  列 化:  指把堆内存中的Java对象数据,通过某种方式以二进制形式把对象存储到磁盘文件中或者传递给其他网络的节点。反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象的过程.
    为什么要做序列化:
                      1):在分布式系统中,需要共享数据的JavaBean对象,都得做序列化,此时就得把对象数据转换为二进制形式.
                       以后存储在HttpSession中的对象,都应该实现序列化接口
                      2):服务钝化:如果服务发现某些对象好久都没有活动了,此时服务器就会把这些内存中的对象,持久化在本地磁盘文件中(Java对象-->二进制文件).
                          如果某些对象需要活动的时候,先从内存中去寻找,找到就使用,找不到再去磁盘文件中,反序列化我们得对象数据,恢复成Java对象.
    需要做序列化的对象的类,必须实现序列化接口:java.io.Serializable接口(标志接口[没有抽象方法]).
  2. 使用对象流来完成序列化和反序列化操作:
         ObjectOutputStream:  通过writeObject方法做序列化操作的.
         ObjectInputStream:     通过readObject方法做反序列化操作的.
  3. 序列化的细节:序列化的版本:
        1):如果某些数据不需要做序列化,比如密码,此时怎么办?
              理论上说,静态的字段和瞬态的字段是不能做序列化操作的.
        2):序列化的版本问题:
            反序列化Java对象时必须提供该对象的class文件,但随着项目的升级,系统的class文件也会升级(增加一个字段/删除一个字段),java通过类中提供的一个固定的serialVersionUID(序列化版本号)来判断字节码是否发生改变.
  4. 打印流,打印数据的,打印流只能是输出流:
     PrintStream: 字节打印流
     PrintWriter:  字符打印流
    -对于PrintWriter来说,当启用自动刷新之后,调用println或者printf或者format方法,便会立马刷新操作.
     如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新.
     使用打印流作为输出流,此时的输出操作会特别简单,提供了println方法:打印再换行,可以支持打印/输出各种数据类型的数据
  5. 标准的IO:
     标准的输入:  通过键盘录入数据给程序.
     标准的输出:   在屏幕上显示程序数据.
    在System类中有两个常量:
         InputStream in =   System.in;
         PrintStream out = System.out;
    标准流的重定向操作:
     标准的输入:  通过键盘录入数据给程序.
                        重新指定输入的源不再是键盘,而是一个文件.
        static void setIn(InputStream in)  重新分配“标准”输入流。    
         此后,System.in数据的来源就是通过setIn制定的源.
      标准的输出:   在屏幕上显示程序数据.
                        重新指定输出的目标不再是屏幕,而是一个文件.
         static void setOut(PrintStream out)  重新分配“标准”输出流。

  6. java.util.Scanner类:扫描器类,表示输入操作,String数据时,hasNextLine(),nextLine();
       存在的方法:  xxx表示数据类型,如byte,int ,boolean等.
                 boolean  hasNextXxx():判断是否有下一种类型的数据
                 Xxx          nextXxx():获取下一个该类型的数据.

  7. 数据流,提供了可以读/写任意数据类型的方法:
    DataOutputStream:   提供了 writeXxx(xxx value)方法.
    DataInputStream:      提供了 readXxx()方法.
      注意: writeXxx和readXxx必须要对应起来,  writeByte写出的数据,此时只能使用readByte读取回来.

  8. 随机访问文件(RandomAccessFile):表示可以在该文件的任何位置写出和读取数据.
    RandomAccessFile经常用来做多线程断点下载:
       1):多线程
       2):断点下载

  9. 管道流:实现两个线程之间的数据交互.
    PipedInputStream
    PipedOutputStream
    PipedReder
    PipedWriter

  10. 日历类(Calendar):是抽象类,表示日历,比Date更强大.
      Calendar c = Calendar.getInstance();
       int get(int field) 返回当前日期的给定日历字段(年,月,日,时,分,秒)的值。
       add(int YEAR,int  10); set(int MINUTE,int  0)
       getTime(); setTime();

  11. 四大基流:
    InputStream---- OutputStream
    Reader         ---- Writer

    文件流:
    FileInputStream
    FileOutputStream
    FileReader
    FileWriter

    缓冲流:
    BufferedInputStream
    BufferedOutputStream
    BufferedReader
    BufferedWriter

    转换流(把字节转换为字符):
    InputStreamReader
    OutputStreamWriter

    内存流(临时存储数据):
    ByteArrayInputStream
    ByteArrayOutputStream
    CharArrayReader
    CharArrayWriter
    StringReader
    StringWriter

    顺序流(合并流):
    SequenceInputStream

    对象流(序列化和反序列化):
    ObjectInputStream
    ObjectOutputStream

    打印流:
    PrintStream
    PrintWriter

    数据流:
    DataInputStream
    DataOutputStream

    管道流:
    PipedInputStream
    PipedOutputStream
    PipedReader
    PipedWriter
    ------------------
    File
    FIlenameFilter
    RandomAccessFile
    Files

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值