Java IO流

Java的IO通过java.io包下类和接口来支持,主要包括输入、输出两种IO流,每种输入、输出流又可以分为字节流和字符流两大类。其中字节流以字节为单位处理输入、输出操作,而字符流以字符为单位处理输入、输出操作,另外IO流还分为底层节点流和上层处理流,其中节点流用于和底层的屋里节点流包装成统一的处理流,从而允许程序使用统一的输入、输出流来读取不同的资源。

1.File

  • File类可以使用文件路径字符串路径来创建File的实例,可以是绝对路径也可以是相对路径。系统默认有“user.dir”指定相对路径。
  • File相关的方法主要分为五大类
    1. 文件名相关方法
      String getName():文件名或最后一级子路径名
      String getPath():路径名
      File getAbsoluteFile():绝对路径
      String getAbsolutePath():绝对路径名
      String getParent():最后一级子目录的父目录名
      boolean reNameTo(File newFileName):重名此File对象所对应的文件或目录
    2. 文件检测
      boolean exists():文件或目录是否存在
      boolean canWrite():是否可写
      boolean canRead():是否可读
      boolean isFile():是否是文件
      boolean isDirectory():是否是目录
      boolean isAbsolute():File对象对应的文件是否是绝对路径
    3. 常规信息
      long lastModefied:最后修改时间
      long length:文件内容长度
    4. 文件操作
      boolean createNewFile():File对应文件不存在时,创建一个新的File对象所指定的新文件
      boolean delete():删除File对象对应的文件或目录
      static File createTempFile(String prefix,String suffix):在默认的文件目录中创建临时的空文件.
      static File createTempFile(String prefix,String suffix,File directory):在指定的目录中创建临时的空文件.
      void deleteOnExit():当jvm退出时,删除File对象所对应的文件或目录
    5. 目录操作
      boolean mkdir:创建目录
      String[] listFiles():列出File对象所有的子文件件名和路径名
      File[] listFiles:列出File对象的所有子文件和路径
      static File[] listRoots():累出系统所有的根路径

2.理解IO流

  • 流的分类
    1. 按照流的方向可以分为输入流和输出流:只需记住这里的输入,输出都是按程序运行所在的内存的角度来划分的. 输入流基类为:InputStream,Reader,输出流基类为:OutputStream,Writer , 它们都是抽象类,无法直接创建实例.
    2. 按照数据传输单元可以分为字节流和字符流: 这两者使用上几乎一样,区别在两者的数据传输单元大小不同,字节流是8位字节,字符流是16位字节,字节流基类为:InputStream,OutputStream , 字符流基类为:Reader ,Writer
    3. 按照流的角色可以分为节点流和处理流: 节点流定义是可以从特定的io设备读写数据的流 , 处理流是对已存在的流进行包装, 通常处理流会对节点流进行包装,这样的好处在于通常只需要采用一套处理流的代码来访问不同的数据流.
  • 流的概念模型

    1. java中IO流涉及的类很多,看上去杂乱无章,但实际非常有规则 ,IO流中类大部分从下面这四个基类抽象而来:

      • InputStream/Reader :所有输入流的基类, 前者是字节流,后者是字符流.
        字节流和字符流处理数据的方式非常相似,区别在于它们的数据传输单元大小不一样,在处理数据过程中存在隐示的指针记录”水滴”读取的位置,每当程序从水管中取出一个/多个水滴后,指针将自动向后移动,而且IO类也提供相应的方法来控制该隐示指针的位置和移动
        输入流模型图-来自.
      • OutputStream/Writer:所有输出流的基类,前者是字节流,后者是字符流.
        替代文字
        输出流在处理数据的过程和输入流恰好是相反的方式,它是从数据源中读入数据放入水管中,同样的存在隐示的指针记录水滴放入的位置.
      • 处理流替代文字

      为什么存在处理流呢?

      1. 提高性能:主要采用增加缓存的方式来提高输入/输出的效率
      2. 提供便捷的方法来一次性输入/输出大量的内容.而不是一次输入/输出一个/多个”水滴”
  • 使用IO流

    • 字节输入流和输出流示例代码

      @Test
      public void testDemo3()   {
          InputStream inputStream = null;
          OutputStream outputStream = null;
          try {
              inputStream = new FileInputStream("E:\\book\\testInputStream.txt");
              outputStream = new FileOutputStream("E:\\book\\testOutputStream.txt");
              byte[] bytes = new byte[1024]; //字符流只需将byte换成char即可
              int len = 0;
              while (-1 != (len = inputStream.read(bytes))) {
                  System.out.println(new String(bytes, 0, len));
                  outputStream.write(bytes,0,len);
              }
          } catch (IOException e) {
              e.printStackTrace();
          }finally {
              try {
                  if (inputStream != null) {
                      inputStream.close();
                  }
                  if (outputStream != null) {
                      outputStream.close();
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
    • 处理流示例代码

      @Test
      public void testDemo4() {
          OutputStream outputStream = null;
          PrintStream printStream = null;
          try {
              outputStream = new FileOutputStream("E:\\book\\testOutputStream.txt");
              printStream = new PrintStream(outputStream);
              printStream.print("use printSream wirte info");
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } finally {
              if (printStream != null) {
                  printStream.close();
              }
          }
      }
      当关闭处理流的时候系统会自动被包装的节点流
  • 流的分类汇总
    替代文字
    在处理字符文件的通常使用字符流,其他情况通常使用字节流,字节流更就通用性,因为计算机所有的数据都是二进制的.

有问题或建议请联系邮箱:981017952@qq.com,qq:981017952

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值