• 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的大文件。

  • 相关阅读:
    PaoptMap
    NES游戏常用汇编指令
    JS_XMLHttpRequest
    Function Evaluation
    exists的用法
    我的博客园博客开通咯(qyl)
    数据库访问类(Sql)
    Show一下自己的编程工具
    Ajax.net使用初体验
    WEB打印代码大全(NEW!!)
  • 原文地址:https://www.cnblogs.com/tsruixi/p/14288839.html
Copyright © 2020-2023  润新知