zoukankan      html  css  js  c++  java
  • Java中的文件IO流

    1,File类
    ··· 概念:File对象可以表示一个文件或目录。可以对其进行增删改查。
    ··· 常用方法:
        File f = new File(".");
        判断是不是目录:f.isDictionary();
        判断是不是文件:f.isFile();
        列出目录中的文件名:f.list();
        列出目录中的File对象:f.listFiles();  // 参数可以过滤文件
        新建文件:f.createNewFile();
        新建目录:f.mkdir();  // mkdirs() 创建层级目录
        系统文件分隔符:File.separator。
    ··· 注意:
        · File对象只是用来操作文件和目录的元数据,并不可以读写数据。
        · Files是File的工具类,属于NIO可以用来读取文件。
        · Files.readAllBytes()会将文件一次读入内存。
     
    IO流分类
    ··· 按操作方式:
        · 输入流:InputStream
        · 输出流:OutputStream
    ··· 按数据类型:
        · 字节流:InputStream、OutputStream   # 所有字节流的父类
        · 字符流:Reader、Writer   # 所有字符流的父类
    ··· 按功能:
        · 节点流(原始):InputStream、OutputStream、Reader、Writer  # 直接对目标设备操作
        · 处理流(包装):BufferedReader、BufferedWriter  对节点流进行封装,使功能更强大
    ··· 注意:
        · 输入和输出的参照物是程序本身,不一定是内存到磁盘,因为有可能是内存到内存。
        · 对于二进制文件(如图片)必须使用字节流,因为字符流会根据编码一次读取多个字节,
            如一个图片有199个字节,用字符流读写时,最后一个字节编码会出错。
        · 字节流的读写速度比字符流快,因为字符流还要编码解码。
        · 字符流会使用系统默认编码,无法更改,所以可以使用转换流InputStreamReader读取
            字节流并指定编码。
        · java中的char和String都是以Unicode保存在内存中,需要输出时再转为指定编码。
     
    2,InputStream
    ··· 概念:InputStream是所有输入流的超类,是同步IO。
    ··· 常用方法:
        · 读取到字节数组:read(char[]);  把数据填充到字节数组,并返回实际填充的字节数
        · 读取所有字节:readAllBytes();  # java8中没有
        · 读取指定长度字节:readNBytes(int len);  java8中没有
     
    3,OutputStream
    ··· 概念:与InputStream类似。
    ··· 常用方法:
        · 写入字节到文件:write(byte[]); 
        · 写入数组的指定范围到文件:write(byte[], index, len);  最好使用这种方式。
        · 把把缓冲区里的内容立即写入文件:flush();   把缓冲区的内容立即写入文件。
     
    4,Reader
    ··· 概念:根据系统默认编码,读取多个字节,并解码成字符Unicode保存在char中。
    ··· 用法与字节流类似
     
    5,Writer
    ··· 概念:写入时会将字符根据默认编码方式编码为字节,保存在内部的字节数组中,再输出。
    ··· 用法与字节流类似
     
    6,Buffered
    ··· 概念:Buffered是缓冲流(处理流),本身没有读写能力,通过传入节点流对象。
    ··· 可以按行读取
     
    7,标准输入输出
    ··· System.in、System.out、System.err
    ··· 重定向:
        · 重定向输出:System.setOut(PrintStream);
        · 重定向输入:System.setIn(InputStream);
    ··· 注意:
        · System.in是InputStream类型,System.out和System.err是PrintStream类型。
     
    8,打印流
    ··· PrintStream、PrintWriter;一般用来生成代码模板。标准输出就属于打印流。
    ··· 提供多种数据类型的输出,不会抛出IOException异常,自动flush。
     
    9,NIO
    ··· 概念:IO流是面向流的同步IO,而NIO是面向缓冲区的异步IO(或同步非阻塞,有争议)
    ··· 核心组成:Buffer、Channel、Selector
    ··· Buffer
        · 作用:针对系统的缓冲区,负责存储数据。所有的缓冲区都是Buffer抽象类的子类。
        · 种类:7中基本数据类型的包装类,除Boolean类型。
        · 常见属性:
                capacity:容量。表示缓冲区最大数据容量,创建后不可更改。
                limit:      限制。表示第一个不应该读写数据的索引,limit后的数据不可读写。
                position:位置。表示下一个读写数据的索引,不大于limit。
                mark:     标记。可以指定Buffer中一特定的position。
        · 常用方法:
                allocate(int):创建间接缓冲区,并指定capacity大小。Buffer子类的静态方法(推荐)。
                flip():切换为读模式。默认是写模式。其实就是将limit设为position,position设为0
                clear():清空缓冲区。切换为写模式。其实就是将position设为0,limit设为capacity。
                put():添加数据。
                get():获取数据。
    ··· Channel:
        · 作用:是IO源与目标之间的连接,类似于Stream,只是一种通道,并不会存储数据。
        · 种类:FileChannel读写,映射文件;SocketChannel通过TCP读写网络中的数据。
        · 创建:Channel使用FileInputStream和FileOutputStream的getChannel()方法来创建。
        · 常用方法:
                read(Buffer):是将FileInputStream中打开的文件数据读入到FileBuffer中。
                write(Buffer):是将FileBuffer中的内容写入到FileOutputStream打开的文件中。
    ··· Selector:
        · 作用:用来监测Channel通道中的读写事件是否做好准备,这样一个线程可以管理多个Channel,从而管理多个网络。
    ··· 注意:
        · Buffer中的所有方法都是在修改那4个属性。
        · allocateDirect(int)创建的是直接缓冲区,在系统物理内存中,而不在JVM内存中,JDK控制内力弱,性能高,但是使用有风险,不推荐使用。
        · Files和Paths是文件相关的工具类,属于nio包。
     
    注意事项
        · ObjectInputStream和ObjectOutputStream是对象流,可以用来输入输出对象,即序列化和反序列化,注意:static 和transient修饰的属性不会被序列化。
        ·  Properties:处理Java中*.properties文件常用的属性文件解析类,继承自Hashtable。
  • 相关阅读:
    Git面试题
    JVM的垃圾回收算法
    如何有效避免文件名相同的问题
    java.lang.IllegalArgumentException: An invalid character [44] was present in the Cookie value 异常的原因及处理方法
    eclipse新建maven项目出错 pom.xml报错
    maven配置本地仓库、maven配置阿里中央仓库、eclipse配置maven
    Maven安装、配置环境变量
    XML学习——java解析xml文件
    JSP九大内置对象
    JavaWeb学习——session总结
  • 原文地址:https://www.cnblogs.com/shendeng23/p/12452496.html
Copyright © 2011-2022 走看看