JAVA基础——IO流

初识

  • IO流用来处理设备之间的数据传输
  • Java对数据的操作是通过流的方式
  • Java用于操作流的对象都在IO包中
  • 流按照操作数据分为:字节流、字符流
  • 流按流向分为:输入流、输出流

理解字节流和字符流的区别是解决乱码问题的关键,下面会自顶向下的讲解Java IO的相关内容

IO常用基类

  • 字节流的抽象基类:InputStream,OutputStream
  • 字符流的抽象基类:Reader,Writer

由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀:例如,InputStream的子类FileInputSteram;Reader的子类FileReader

  1. 字符流(如果要操作文字,优先考虑字符流)
    Writer是一个字符输出的抽象顶层类,常用的FileWriter类是这个类的儿子(OutPutStreamWriter)的儿子。
    要使用FileWriter,必须将文件对象传给它供他操作(写入,刷新,关闭等)。
    Reader是一个字符读取的抽象类,与Writer对应,常用的是它的子类的子类FileReader.
  2. 字节流(直接面向字节)
    可以参考InputStream和OutputStream的JDK文档,手下有很多各种各样的流,各有各的功能,都利用了装饰器模式,是对基类的增强,需要啥样的流就用啥样的流。

我举两个例子:

  • 当你用InputStream底下的FileInputStream读取一个文件的时候,每调用一次read()方法,虚拟机就得让操作系统去你的硬盘上读一次,这个显然是不高效的,这时候你就可以使用BufferedInputStream来增强FileInputStream,可以看到BufferedInputStream要接一个InputStream类型的参数,增强之后的输入流会一次性从硬盘读取一部分内容到内存,不用每次read都从硬盘获取(减少了从硬盘读取的次数)。这叫装饰器模式。
  • 如果你用FileWriter写入文件的时候,你调用write方法的时候只能写入字符串啊,有的时候这就非常的不方便,对,还是装饰器模式,找个牛逼的装备给它穿上,比如PrintWriter,这个非常牛逼,它的print方法功能多样,要是对文件中的内容要求比较多,加这个装备就很合适(实际上JDK开发者也想到了这一点,PrintWriter可以直接接收文件名,自动的帮你创建FileWriter?)。

至于字符字节互转的问题,我把书上一段话放上来,可以自行品味一下:OutputStreamWriter类将使用选定的字符编码方式,把Unicode字符流转换为字节流,而InputStreamReader类将包含字节(用某种字符编码方式表示的字符)的输入流转换为可以产生Unicode码元的读入器。(可以使用nio里面的Charset相关方法调用内置的编码转换器转换)

对象序列化(这个重要性比较低,用时再看)

  使用ObjectInputStream和ObjectOutputStream来序列化对象,使用对象的序列号标记对象,对于两个对象共同引用同一的对象的情况,在第二次遇到要序列化的对象的时候,只需要标明这个序列号的对象已经被序列化了就行了。
  有些数据是不可以序列化的(对反序列化的机器没有意义的数据),可以将这些数据标记成transient即可。还可以自定义序列化方法,只要自定义了这两个方法,序列化的时候就不会自动序列化了,而是调用这些方法。
  序列化机制在流中仅仅记录该对象所属的类,实现了Externalizable接口可以包括父类数据的整个对象的存储和恢复负全责。
  序列化单例和类型安全的枚举的时候,需要添加readResolve方法。
  还有用序列化技术克隆对象的……

操作文件

JDK7里面新加了两个类,Path和Files类,非常好用。一个管路径,一个管文件,有很多非常方便的功能,每当有文件相关的什么操作的时候可以优先考虑这两个类。
  还有个ZIP文件系统,有什么zip、jar相关文件可以找这个类。
  还有个FileChannel类,和内存映射有关,可以将一个文件或文件的一部分“映射”到内存中,然后这个文件就可以当作内存数组一样访问,对内存中的操作会在合适的时机(比如通道关闭的时候)写入到实际文件中。这种操作文件的速度很快,但是对中等尺寸文件的顺序读入则没有必要使用内存映射。

(更加详细的内容会在用到的时候慢慢补充进来)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值