IO笔记

1. File代表与平台无关的文件和目录,新建、删除、重命名文件和目录。

2. 输入流:InputStream,Reader;输出流:OutputStream,Writer

3. 字节流,字符流;节点流,处理流。装饰器模式。

4. 处理流封装节点流,屏蔽底层设备节点流的差异,提供更加方便的输入输出方法。

    节点流:构造器参数是物理IO节点

    处理流:构造器参数是已存在的节点流

5. 输出文本内容,使用PrintStream包装输出节点流。只关闭处理流即可,系统会自动关闭被包装的节点流。

    读取文本内容,使用BufferedReader包装输入节点流。例:BufferedReader(new InputStreamReader(System.in))

6. 输入/输出的内容是文本,考虑使用字符流;输入/输出内容是二进制内容,考虑使用字节流。

7. 两个转换流:InputStreamReader,OutputStreamWriter。字节流转成字符流

8. System.setErr(),重定向标准错误输出。

    System.setIn(),重定向标准输入。

    System.setOut(),重定向标准输出。

9. RandomAccessFile,文件内容访问类,可以任意访问文件内容。

10. 对象序列号机制允许把内存中的java对象转换成平台无关的二进制流,可以在网络或磁盘上传输。

11. 目标类实现Serializable接口,方可序列化。

12. 序列化的步骤:

      1. 创建一个ObjectOutputStream

      2. 调用ObjectOutputStream对象的writeObject()方法

13. 反序列化的步骤:

     1. 创建一个ObjectInputStream

     2. 调用ObjectInputStream的readObject()方法

14. 反序列化无须通过构造器初始化对象。

15. 如果一个可序列化类有多个父类,则该类的所有父类要么是可序列化的,要么有无参数的构造器。

16. 含有引用类型的类,引用类型是可序列化的,类才可以序列化。

17. 同一个对象,只被序列化一次,后续序列化,只使用序列化编号。如果多次序列同一个java对象,只有第一次序列化才会把对象转换成字节流并输出。

18. 通过在属性前面加上transient关键字,可以指定java序列化时无须理会该属性。transient只能用来修饰属性,不能修饰其他。

19. 自定义序列化的几个方法,写在被序列化的类中。系统在序列化某个对象之前,会先调用writeRelpace和writeObject方法。反序列化时,调用readObject和readResolve

      1. writeReplace();

      2.  writeObject();

      3. readObjectNoData();

      4. readObject();

      5. readResolve();

20. 早期的单例类和枚举类在反序列化后,会生成新的对象,为保证和序列化前的对象一致,需要提供readResolve方法。

21. 序列化版本兼容问题,使用序列化ID。新类修改方法和静态属性,不影响反序列化,不用修改序列化serialVersionUID。如果修改非静态属性,同名,不同类型,反序列化         失败,需跟新serivalVersionUID。新类比序列化对象流中的属性 多,或者少 都可以正常反序列化,无须更新serivalVersionUID。

22. java 新io采用内存映射文件的方式来处理输入输出,新IO把文件或文件的一段映射到内存中,比传统的输入输出快很多。

23. Channel和Buffer是新IO中两个核心类。新IO系统中,所有数据都要经过Channel,传统的面向流处理,新IO面向块处理。Buffer可以理解成一个容器,发送到Channel中数        据和从Channel中读取的数据都要先放到Buffer中。还有字符串映射到Charset类,以及非阻塞式输入输出的Selector类。

24. Buffer是抽象类,其子类有XXXBuffer。其中ByteBuffer和CharBuffer最常用。Buffer中常用的三个重要概念:

      容量:capacity

      界限:limit

      位置:position

     三者关系:0 <= position <= limit <= capacity

25. Buffer中包含两个重要方法:flip和clear,flip为从Buffer中取出数据做好准备,clear则向Buffer中装入数据做好准备。clear不清空buffer中的数据。

26. Buffer还包含put和get方法,用于向Buffer中放入数据和取出数据。

27. Channel可以直接将文件的部分或全部映射成Buffer,Channel只能和Buffer交互。Channel通过传统节点流InputStream,OutputStream的getChannel获得。

28. Channel中最常用的三类方法是:map,read和write;map用于将Channel对应的部分或全部数据映射到ByteBuffer;read和write用于从Buffer中读数据或写数据。

29. 把明文的字符序列转换成计算机理解的字节序列(二进制文件),称为编码;把字节序列转化成普通人能看懂的明文字符串,称为解码。

30. Charset.availableCharsets()可以取代所支持的字符集。

       Charset csCn = Charset.forName("GBK");

       csCn.new Encoder().encode() / new Decoder().decode();

       Charset自身也含有decode和encode方法,进行编码和解码。

31. String的getBytes方法,就是使用特定字符集将字符串转成字节序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值