IO流(一)

28 阅读4分钟

一、IO流概述

1、IO的作用

读写文件数据的

2、IO流是怎么划分的,大体分为几类,各自的作用

  • 字节流:字节输入流,字节输出流(读写字节数数据的)
  • 字符流:字符输入流,字符输出流(读写字符数据的)

二、字节流的使用

1、文件字节输入流:读取每一个字节

  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。按照字节读文件数据到内存中。
  • 构造器:
    • public FileInputStream(File file):创建字节输入流管道与源文件对象接通
    • public FileInputStream(String pathname):创建字节输入流管道与源文件路径接通。
  • 方法:
    • public int read(): 每次读取一个字节返回,读取完毕返回-1。
        // 1、创建一个文件字节输入流管道与源文件接通。
        // InputStream is = new FileInputStream(new File("file-io-app\\src\\data.txt"));
        // 简化写法
        InputStream is = new FileInputStream("file-io-app\\src\\data.txt");

        // 2、读取一个字节返回 (每次读取一滴水)
//        int b1 = is.read();
//        System.out.println((char)b1);
//
//        int b2 = is.read();
//        System.out.println((char)b2);
//
//        int b3 = is.read();
//        System.out.println((char)b3);
//
//        int b4 = is.read(); // 读取完毕返回-1
//        System.out.println(b4);

        // 3、使用循环改进
        // 定义一个变量记录每次读取的字节    a  b  3   爱
        //                              o o  o   [ooo]
        int b;
        while (( b = is.read() ) != -1){
            System.out.print((char) b);
        }
  • 存在的问题:
    • 性能较慢
    • 读取中文字符输出无法避免乱码问题

2、文件字节输入流:每次读取一个字节数组

        // 1、创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("file-io-app/src/data02.txt");

          // 2、定义一个字节数组,用于读取字节数组
//        byte[] buffer = new byte[3]; // 3B
//        int len = is.read(buffer);
//        System.out.println("读取了几个字节:" + len);
//        String rs = new String(buffer);
//        System.out.println(rs);
//
//        int len1 = is.read(buffer);
//        System.out.println("读取了几个字节:" + len1);
//        String rs1 = new String(buffer);
//        System.out.println(rs1);
//        // buffer = [a b c]
//
//        // buffer = [a b c]  ==>  [c d c]
//        int len2 = is.read(buffer);
//        System.out.println("读取了几个字节:" + len2);
//        // 读取多少倒出多少
//        String rs2 = new String(buffer,0 ,len2);
//        System.out.println(rs2);
//
//        int len3 = is.read(buffer);
//        System.out.println(len3); // 读取完毕返回-1

        // 3、改进使用循环,每次读取一个字节数组
        byte[] buffer = new byte[3];
        int len; // 记录每次读取的字节数。
        while ((len = is.read(buffer)) != -1) {
            // 读取多少倒出多少
            System.out.print(new String(buffer, 0 , len));
        }

3、文件字节输入流:一次读完全部字节

使用文件字节输入流一次读完文件的全部字节。可以解决乱码问题。

        // 1、创建一个文件字节输入流管道与源文件接通
        File f = new File("file-io-app/src/data03.txt");
        InputStream is = new FileInputStream(f);

        // 2、定义一个字节数组与文件的大小刚刚一样大。
//        byte[] buffer = new byte[(int) f.length()];
//        int len = is.read(buffer);
//        System.out.println("读取了多少个字节:" + len);
//        System.out.println("文件大小:" + f.length());
//        System.out.println(new String(buffer));

        // 读取全部字节数组
        byte[] buffer = is.readAllBytes();
        System.out.println(new String(buffer));

4、文件字节输出流:写字节数据到文件

a.FileOutputStream文件字节输出流

  • 作用:以内存为基准,把内存中的数据,按照字节的形式写出到磁盘文件中去。 简单来说,把内存数据按照字节写出到磁盘文件中去。
  • 构造器: public FileOutputStream(File file):创建一个字节输出流管道通向目标文件对象。 public FileOutputStream(String file):创建一个字节输出流管道通向目标文件路径。 public FileOutputStream(File file , boolean append):创建一个追加数据的字节输出流管道通向目标文件对象。 public FileOutputStream(String file , boolean append):创建一个追加数据的字节输出流管道通向目标文件路径。
  • 方法:
    • public void write(int a):写一个字节出去 。
    • public void write(byte\[] buffer):写一个字节数组出去。
    • public void write(byte\[] buffer , int pos , int len):写一个字节数组的一部分出去。参数一,字节数组;参数二:起始字节索引位置,参数三:写多少个字节数出去。
// 1、创建一个文件字节输出流管道与目标文件接通
        OutputStream os = new FileOutputStream("file-io-app/src/out04.txt" , true); // 追加数据管道
//        OutputStream os = new FileOutputStream("file-io-app/src/out04.txt"); // 先清空之前的数据,写新数据进入

        // 2、写数据出去
        // a.public void write(int a):写一个字节出去
        os.write('a');
        os.write(98);
        os.write("\r\n".getBytes()); // 换行
        // os.write('徐'); // [ooo]

        // b.public void write(byte[] buffer):写一个字节数组出去。
        byte[] buffer = {'a' , 97, 98, 99};
        os.write(buffer);
        os.write("\r\n".getBytes()); // 换行

        byte[] buffer2 = "我是中国人".getBytes();
//        byte[] buffer2 = "我是中国人".getBytes("GBK");
        os.write(buffer2);
        os.write("\r\n".getBytes()); // 换行


        // c. public void write(byte[] buffer , int pos , int len):写一个字节数组的一部分出去。
        byte[] buffer3 = {'a',97, 98, 99};
        os.write(buffer3, 0 , 3);
        os.write("\r\n".getBytes()); // 换行

        // os.flush(); // 写数据必须,刷新数据 可以继续使用流
        os.close(); // 释放资源,包含了刷新的!关闭后流不可以使用了