io流的概述和分类

:::tips

概念

  • I表示 Intput,输入
  • O表示 Output,输出

    IO流的作用

  • 输入流:读取文件中已经存在的数据到程序中

  • 输出流:将内存数据写到文件中,实现数据永久化存储

    顶级父类(抽象的)

    字节流 字节输入流InputStream 字节输出流OutputStream
    字符流 字符输入流Reader 字符输出流Writer
    image.png :::

    字节流写数据API

    :::tips

    字节输出流的顶级父类OutputStream是抽象的, 我们可以使用它的子类FileOutputStream操作文件

    构造方法
  • FileOutputStream(String name)通过路径名创建字节输出流,数据将会写到文件中

  • FileOutputStream(File file)通过File对象创建字节输出流,数据将会写到文件中

    常用方法
  • void write(int b) 一次写一个字节数据

  • void write(byte[] b) 一次写一个字节数组数据
  • void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据

    数据追加续写和换行

  • public FileOutputStream(String name,boolean append) 参数为true, 以追加的形式写数据到文件, 不会覆盖文件

    换行符

  • windows:\r\n

  • linux:\n
  • mac:\r

String和byte数组转换API

  • String转成byte[]
    • byte[] getBytes() 将String的内容转成byte[]
  • byte[]转成String

    • String(byte bytes[]) 将byte[]的内容转成String
    • String(byte bytes[], int offset, int length) 将byte[]的部分内容转成String :::

      字节流读数据API

      :::tips

      字节输入流的顶级父类InputStream是抽象的, 我们可以使用它的子类FileInputStream操作文件

      构造方法
  • FileInputStream(String name) 通过文件路径创建字节输入流对象,读取指定文件的内容

  • FileInputStream(File file) 通过File对象创建字节输入流对象,读取指定文件的内容
    常用方法
    int read() 从流中读取一个字节,返回字节内容
    int read(byte[] b) 从流中读取多个字节保存参数的数组中,返回读取的自己数量 :::

字符流读数据API

:::tips

字节流一次读一个字节会出现读取中文乱码问题所以可以使用字符流

字符输入流的顶级父类Reader是抽象的, 我们可以使用它的子类 FileReader 操作文件

构造方法

  • FileReader(String fileName) 根据字符串路径,指定读取的文件
  • FileReader(File file) 根据File对象,指定读取的文件

    常用方法

  • int read() 从流中读取一个字符,返回读取到的字符,读不到返回-1

  • int read(char[] b) 从流中读取多个字符保存到字符数组中,返回读取的字符个数,读不到返回-1 :::

    字符流写数据API

    :::tips

    字符输出流的顶级父类Writer是抽象的, 我们可以使用它的子类 FileWriter 操作文件

    构造方法

  • FileWriter(String fileName) 根据字符串路径,写出数据到文件

  • FileWriter(File file) 根据File对象,写出数据到文件

    常用方法

  • void write(int c) 写一个字符到流中,如果是数字,会转为码表上对应的字符写出

  • void write(char[] cbuf) 写入一个字符数组到流中
  • void write(char[] cbuf, int off, int len) 写入字符数组的一部分到流中
  • void write(String str) 写一个字符串到流中
  • void write(String str, int off, int len) 写一个字符串的一部分到流中 :::

    flush和close的区别

    :::tips

  • flush() 刷新流,还可以继续写数据

  • close() 关闭流,但是在关闭之前会自动刷新流;一旦关闭,就不能再写数据

    注意:

  • 使用FileWrite写完数据后,记得要刷新或者关闭流,否则数据不会进入文件 :::

    1. public static void main(String[] args) throws IOException {
    2. //FileOutputStream(文件地址);
    3. //不管a.txt是否存在,创建流的时候都会覆盖原文件,创建一个新的
    4. //FileOutputStream stream = new FileOutputStream("Day10FileIO\\FileWrite\\a\\b.txt");
    5. //true表示在原来文件基础上追加内容
    6. FileOutputStream stream =
    7. new FileOutputStream("Day10FileIO\\FileWrite\\a\\b.txt", true);
    8. //往a.txt中写入一个字节
    9. /*stream.write(65);
    10. stream.write(66);
    11. stream.write(67);*/
    12. /*byte[] arr1 = {97, 98, 99, 100, 101};
    13. stream.write(arr1);
    14. stream.write(arr1, 1, 3);*/
    15. for (int i = 0; i < 3; i++) {
    16. stream.write("爪哇基础\n".getBytes());
    17. }
    18. //关闭流
    19. stream.close();
    20. }
    1. public static void main(String[] args) throws Exception{
    2. FileInputStream stream = new FileInputStream("Day10FileIO\\FileWrite\\a\\a.txt");
    3. //获取单个字节,读取结束返回-1
    4. /*int read = stream.read();
    5. System.out.println(read);*/
    6. //循环获取字节,到-1时结束
    7. /*while (true) {
    8. int read = stream.read();
    9. if (read != -1) {
    10. System.out.println(read);
    11. }else {
    12. break;
    13. }
    14. }*/
    15. int read;
    16. while ((read = stream.read()) != -1) {
    17. System.out.println(read);
    18. }
    19. stream.close();
    20. }
    1. public static void main(String[] args) throws Exception {
    2. FileInputStream input = new FileInputStream("Day10FileIO\\FileWrite\\a\\a.txt");
    3. //定义一个长度为3的字节数组,每次读取3个字节到数组里
    4. //如果String(arr, 0, len),不加0,跟len,读到最后会保存旧的数组值
    5. //例:"hello" arr[3] = {hel} {lol}
    6. //当读取结束会返回-1
    7. /*byte[] arr = new byte[3];
    8. int len = input.read(arr);
    9. System.out.println(new String(arr, 0, len));*/
    10. byte[] arr = new byte[1024];
    11. int len;
    12. while ((len = input.read(arr)) != -1) {
    13. System.out.println(new String(arr, 0 ,len));
    14. }
    15. input.close();
    16. }
    1. public static void main(String[] args) throws Exception {
    2. FileInputStream input = new FileInputStream("E:\\File\\picture.jpg");
    3. FileOutputStream output = new FileOutputStream("Day10FileIO\\FileWrite\\a\\picture.jpg");
    4. byte[] arr = new byte[1024];
    5. int len;
    6. while ((len = input.read(arr)) != -1) {
    7. output.write(arr, 0, len);
    8. }
    9. input.close();
    10. output.close();
    11. }
    1. public static void main(String[] args) {
    2. //String 转 byte数组
    3. String s1 = "abcde";
    4. byte[] arr1 = s1.getBytes();
    5. System.out.println(Arrays.toString(arr1));
    6. String s2 = "爪哇";
    7. byte[] arr2 = s2.getBytes();
    8. System.out.println(Arrays.toString(arr2));
    9. //byte数组转String
    10. byte[] arr3 = {-25, -120, -86, -27, -109, -121};
    11. String s3 = new String(arr3);
    12. System.out.println(s3);
    13. //byte数组转String,索引从0开始往后取3个
    14. byte[] arr4 = {97, 98, 99, 100, 101};
    15. String s4 = new String(arr4, 0, 3);
    16. System.out.println(s4);
    17. //字符串转字符数组
    18. char[] arr5 = s1.toCharArray();
    19. System.out.println(Arrays.toString(arr5));
    20. }
    /*
    目标:使用FileWriter写出数据到文件
      小结:
          1.字符输出流:
              Writer是字符输出流的抽象父类。
              FileWriter继承了Writer,用于从程序写出数据到文件。
          2.FileWriter构造方法:
              FileWriter(String fileName)
          3.FileWriter写数据的方法:
              void write(int c) 写一个字符到流中
              void write(char[] cbuf) 写入一个字符数组到流中
              void write(char[] cbuf, int off, int len) 写入字符数组的一部分到流中
              void write(String str) 写一个字符串到流中
              void write(String str, int off, int len) 写一个字符串的一部分到流中
         4.close和flush方法的区别
          flush(): 刷新缓冲区, flush后可以再写数据。
          close(): 关闭文件,关闭文件前会自动flush, close后不能再写数据
    */
    public class DemoFileWrite {
      public static void main(String[] args) throws Exception {
          //FileWriter fWriter = new FileWriter("Day10FileIO\\FileWrite\\a\\a.txt");
          FileWriter fWriter = new FileWriter("Day10FileIO\\FileWrite\\a\\a.txt", true);
    
          //fWriter.write(65);
    
          /*char[] chars = {65, 66, 67};
          fWriter.write(chars);*/
    
          /*char[] chars = {65, 66, 67, 68, 69};
          fWriter.write(chars, 1, 3);*/
    
          //fWriter.write("abcdedf");
    
          fWriter.write("abcdedf", 0, 1);
    
          fWriter.close();
      }
    }
    
    public class DemoReader {
      public static void main(String[] args) throws Exception {
          //创建字符输入流
          FileReader reader = new FileReader("Day10FileIO\\FileWrite\\a\\b.txt");
    
          /*int read = reader.read();
          System.out.println((char) read);*/
          //循环一次读取一个字符
          /*int ch;
          while ((ch = reader.read()) != -1) {
              System.out.println((char)ch);
          }*/
          //重点
          //一次读取多个字符,把读到的内容装进字符数组,读取结束返回-1
          char[] arr = new char[1024];
          int len;
          while ((len = reader.read(arr)) != -1) {
              System.out.println(new String(arr, 0, len));
          }
          reader.close();
      }
    }