how2j学习记录16_IO流

Posted 留点汗证明还活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了how2j学习记录16_IO流相关的知识,希望对你有一定的参考价值。

什么是流

  当不同的介质之间有数据交互的时候,JAVA就使用流来实现。
  数据源可以是文件,还可以是数据库,网络甚至是其他的程序
  比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流
  输入流: InputStream
  输出流:OutputStream

字节流 

  InputStream字节输入流
  OutputStream字节输出流用于以字节的形式读取和写入数据

ASCII码 概念
  所有的数据存放在计算机中都是以数字的形式存放的。 所以字母就需要转换为数字才能够存放。
  比如A就对应的数字65,a对应的数字97. 不同的字母和符号对应不同的数字,就是一张码表。
  ASCII是这样的一种码表。 只包含简单的英文字母,符号,数字等等。 不包含中文,德文,俄语等复杂的

以字节流的形式读取文件内容

  File f =new File("d:/lol.txt");
  //创建基于文件的输入流
  FileInputStream fis =new FileInputStream(f);
  //创建字节数组,其长度就是文件的长度
  byte[] all =new byte[(int) f.length()];
  //以字节流的形式读取文件所有内容
  fis.read(all);
  for (byte b : all) {
    //打印出来是65 66
    System.out.println(b);
  }
  //每次使用完流,都应该进行关闭
  fis.close();

以字节流的形式向文件写入数据
  // 准备文件lol2.txt其中的内容是空的
  File f = new File("d:/lol2.txt");
  // 准备长度是2的字节数组,用88,89初始化,其对应的字符分别是X,Y
  byte data[] = { 88, 89 };

  // 创建基于文件的输出流
  FileOutputStream fos = new FileOutputStream(f);
  // 把数据写入到输出流
  fos.write(data);
  // 关闭输出流
  fos.close();
  注: 如果文件d:/lol2.txt不存在,写出操作会自动创建该文件。但是如果是文件 d:/xyz/lol2.txt,而目录xyz又不存在,会抛出异常

关闭流得方式

  所有的流,无论是输入流还是输出流,使用完毕之后,都应该关闭。 如果不关闭,会产生对资源占用的浪费

  a.try中关闭流

    在try的作用域里关闭文件输入流,如果文件不存在,或者读取的时候出现问题而抛出异常,那么就不会执行这一行关闭流的代码,存在巨大的资源占用隐患。 不推荐使用

  b.在finally中关闭

    这是标准的关闭流的方式

    1. 首先把流的引用声明在try的外面,如果声明在try里面,其作用域无法抵达finally.
    2. 在finally关闭之前,要先判断该引用是否为空
    3. 关闭的时候,需要再一次进行try catch处理

  c.使用try()的方式  

    把流定义在try()里,try,catch或者finally结束的时候,会自动关闭
    这种编写代码的方式叫做 try-with-resources
    所有的流,都实现了一个接口叫做 AutoCloseable,任何类实现了这个接口,都可以在try()中进行实例化。 并且在try, catch, finally结束的时候自动关闭,回收相关资源。
    //把流定义在try()里,try,catch或者finally结束的时候,会自动关闭
    try (FileInputStream fis = new FileInputStream(f)) {
      byte[] all = new byte[(int) f.length()];
      fis.read(all);
      for (byte b : all) {
        System.out.println(b);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }

字符流

  Reader字符输入流
  Writer字符输出流

  使用字符流读取文件   

    // 准备文件lol.txt其中的内容是AB
    File f = new File("d:/lol.txt");
    // 创建基于文件的Reader
    try (FileReader fr = new FileReader(f)) {
      // 创建字符数组,其长度就是文件的长度
      char[] all = new char[(int) f.length()];
      // 以字符流的形式读取文件所有内容
      fr.read(all);
      for (char b : all) {
        // 打印出来是A B
        System.out.println(b);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }

  使用字符流把字符串写入到文件   

    File f = new File("d:/lol2.txt");
    // 创建基于文件的Writer
    try (FileWriter fr = new FileWriter(f)) {
      // 以字符流的形式把数据写入到文件中
      String data="abcdefg1234567890";
      char[] cs = data.toCharArray();
      fr.write(cs);

    } catch (IOException e) {
      e.printStackTrace();
    }

 

以上是关于how2j学习记录16_IO流的主要内容,如果未能解决你的问题,请参考以下文章

Java学习记录(补充八:Date类;Java流(Stream),文件(File)和IO)

JAVA零基础小白免费学习教程day16-字节流&字符流

JAVA零基础小白免费学习教程day16-字节流&字符流

java io流

Java基础——iO

HOW2J Java 文件输入输出流,合并与拆分