Java基础-IO

IO

  1. InputStream/OutputStream
    • IO流以byte为最小单位,因此也称为字节流。
    • InputStream,从磁盘内容读取到内存中,称为输入流。
    • OutputStream,从内存写入磁盘文件,称为输出流。
  2. Reader/Writer
    • 按照char来读这种流称为字符流。
    • 最小传输数据单位是char。
    • 如果数据源不是文本,只能使用InputStream,如果是文本,使用Reader更加方便一些。
  3. 同步/异步
    • 同步IO是指必须等待数据放回后才可以执行代码,优点是代码编写简单,但是CPU执行效率低;
    • 异步是指IO时仅发出请求,然后立刻执行后序代码,优点是CPU执行效率高,缺点是代码编写简单;
    • java.io提供了同步IO,而java.nio则是异步IO;

一、File对象

  1. 路径分割符的注意:
    • Windows平台使用 作为路径分割符;
    • 在Java字符串中需要用\表示一个
    • Linux平台使用/作为路径分割符;
  2. File对象有三种形式表示路径:
    • getPath(),返回构造方法传入的路径;
    • getAbsolutePath(),返回绝对路径;
    • getCanonicalPath(),返回的是规范路径,而规范路径就是把.和..转换成标准的绝对路径后的路径:C:Windows otepad.exe;
    • File对象有一个静态变量用于表示当前平台的系统分隔符,System.out.println(File.separator); // 根据当前平台打印""或"/";
  3. 文件和目录:
    • File对象既可以表示文件,也可以表示目录。
    • 构造一个File对象,不会导致任何磁盘的操作,只有调用File对象的某些方法的时候,才真正进行磁盘操作;
    • File对象获取到一个文件时,还可以进一步判断文件的权限和大小。
  4. 创建和删除文件:
    • 当File文件表示一个文件时,可以通过createNewFile()创建一个新文件,用delete()删除该文件;
    • 需要一些临时文件,File对象提供了createTempFile()来创建一个临时文件,以及deleteOnExit(),在JVM退出时自动时自动删除该文件。;
  5. 遍历文件和目录:
    • 当File对象表示一个目录的时候,可以使用list()和listFiles()列出目录下的文件和子目录名。
    • 同样也可以通过一下方法创建和删除目录:
    • **boolean mkdir(): **,创建当前File对象表示的目录;
    • **boolean mkdirs(): **,创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来。
    • **boolean delete(): **,删除当前File对象表示的目录,当前目录必须在空才能删除成功。
  6. Path:
    • Java标准库提供了一个Path对象,它位于java.nio.file包,和File对象类似。

三、InputStream

  1. 是一个抽象类,它是所有输入流的超类;
  2. 最重要的一个方法是read()方法,同时流都是通过close()来关闭流的;
  3. 缓冲:
    • 提供了两个重载的方法来支持读取多个字节,int read(byte[] b), 读取若干字节并填充到byte数组,返回读取的字节数;
    • int read(byte[], int off, int len):指定byte[]数组的偏移量和最大填充数;
  4. 阻塞:在调用InputStream的read方法读取数据时,我们说的read方法是阻塞的;

四、OutputStream

  1. 某些情况下,需要强制调用使用flush()方法来强制删除缓冲区。
  2. 总是使用try(resource)来保证OutputStream正确关闭。

五、Filter模式

  1. Java的IO标准库提供的InputStream根据来源可以包括:
    • FileInputStream,从文件读取数据
    • ServletInputStream,从HTTP请求读取数据
    • Socket.getInputStream,从TCP连接读取数据
    • ........
  2. 为了解决依赖继承会导致子类数量失控的问题,JDK首先将InputStream分为两大类:
    • 一类是直接提供数据的基础InputStream
    • 一类是提供额外附加功能的InputStream
  3. 通过一个“基础”组件再叠加各种“附加”功能组件的模式,称为Filter模式(或者叫装饰器模式:Decorator)

六、操作Zip

  1. ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容。
  2. ZipInputStream可以读取zip格式的流,ZipOutputStream可以把多份数据写入zip包;
  3. 配合FileInputStream和FileOutputStream就可以读写zip文件;

七、读取classpath文件

  1. 把资源存储在classpath中可以避免文件路径依赖;
  2. Class对象的getResourceAsStream()可以从classpath中读取指定资源;
  3. 根据classpath读取资源时,需要检查返回的InputStream是否为null;

八、序列化

  1. 可以序列化的Java对象必须实现java.io.Serializable接口,类似Serializable这样的空接口被称为“标记接口”(Marker Interface);
  2. 反序列化不调用构造方法,可以设置serialVersionUID作为版本号;
  3. Java的序列机制仅适用于Java,如果需要和其他语言进行交换数据,必须使用序列化方法,例如JSON;

九、Reader

  1. Reader定义了所以字符输入的超类:
    • FileReader实现了文件字符流输入,使用时需要指定编码;
    • CharArrayReader和StringReader可以在内存中模拟一个字符流输入;
  2. Reader是基于InputStream构造的:可以通过InputStreamReader在指定编码的同时将任何InputStream转换为Reader;
  3. 总是使用try(resource)保证Reader正确关闭;

十、Writer

十一、使用Files

  1. 从Java7开始,提供了Files和Paths这两个工具类,能够极大的方便我读写文件;
  2. 虽然Files和Paths是java.nio包里面的类,但是封装了很多简单的读写文件的简单方法;
  3. Files提供的读写文件,受内存限制,只能读写小文件,例如配置文件,不可一次读入几个G的大文件。

原文地址:https://www.cnblogs.com/tsruixi/p/14288839.html