IO输入输出流复习笔记

28 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

IO的分类

在这里插入图片描述 @TOC

字节的输入输出

字节输出流

FileOutputStream 输出步骤 1 创建输出流对象 2 写数据 3 释放资源

 FileOutputStream fos = new FileOutputStream("fbb.txt");
        fos.write("测试".getBytes());//可以写字节
    
        // 字节数组 和指定数组的部分内容
        fos.close();//让流对象关闭可以接着使用
             fos.write("97".getBytes());//可以写字节

进行换行操作使用\n

    for(int i=0;i<10;i++){
            fos.write(("牛逼"+i).getBytes());
            fos.write("\n".getBytes());
        }

文件追加写入

      FileOutputStream fos = new FileOutputStream("fbb.txt",true);

通过他的构造方法可以知道写true表示文件已存在从尾部写入

字节输入

在这里插入图片描述 读取步骤 1 创建字节输入流对象 2 调用read()方法读取数据显示到控制台 3 释放资源

      FileInputStream s1 = new FileInputStream("fbb.txt");
        System.out.println(s1.read());//一次读取一个字节

返回一个字节类型回来

 FileInputStream s1 = new FileInputStream("fbb.txt");
        int by =s1.read();
      while ((by=s1.read())!=-1){//因为他-1时候就是末尾
            System.out.print((char)by);
        }

用循环改进读写

复制文本文件

     FileInputStream s1 = new FileInputStream("fbb.txt");
        FileOutputStream s2= new FileOutputStream("fbb2.txt");
        int by =0;
        while ((by=s1.read())!=-1){//因为他-1时候就是末尾
            s2.write(by);//读取文本 写入进去另一个文本完成复制操作
        }

该方法不需要做转换中文不会出现问号

  FileInputStream s1 = new FileInputStream("D:\\sp_服务端.zip");//读取
        FileOutputStream s2= new FileOutputStream("D:\\测试.zip");//创建
        int by =0;
        while ((by=s1.read())!=-1){//因为他-1时候就是末尾
            s2.write(by);//读取文本 写入进去另一个文本完成复制操作
        }

案例复制压缩包

  FileInputStream s1 = new FileInputStream("D:\\sp_服务端.zip");//读取
        FileOutputStream s2= new FileOutputStream("D:\\测试.zip");//创建
        byte[]arr = new byte[1024];//每次读取10个字节
        int len = s1.read(arr);
        while (len!=-1){
            s2.write(arr);//写入数组
            len=s1.read(arr);

        }

使用数组优化速度,数组的长度一般都是1024或者是1024的整数倍

字节缓存流

BufferedOutputStream

   BufferedOutputStream buff = new BufferedOutputStream(new FileOutputStream("fbb"));
        //读取);
        buff.write("测试".getBytes());

字节缓冲区基础操作还是通过基本流对象实现

    BufferedInputStream buff=  new BufferedInputStream(new FileInputStream("fbb.txt"));
        byte[] ces = new byte[1024];
    int temp =0;
    while (temp!=-1){

        System.out.println(new String(ces,0,temp));
        temp = buff.read(ces);
    }

BufferedInputStream输入,同一个对象只能使用一个。 在这里插入图片描述

高效对比

在这里插入图片描述

字符流

字符流=字节流+编码表

转换流

输出

       OutputStreamWriter s1 = new OutputStreamWriter(new FileOutputStream("E:\\fbb.txt"),"UTF-8");

        s1.write("我嫩爹");
        s1.close();

用OutputStreamWriter一定要记得使用close否则内容会不完整

输入

    InputStreamReader s1 = new InputStreamReader(new FileInputStream("fbb2.txt"),"GBK");
    int ch = 0;
    while ((ch=s1.read())!=-1){
        System.out.println((char)ch);

    }

写入时候是什么编码那么读出时候就指定是什么编码

OutputStreamWriter的方法

在这里插入图片描述 在这里插入图片描述 写数据时候要记得刷新和关闭否则会在缓冲区导致没有写进去

InputStreamReader 的方法

在这里插入图片描述

字符缓冲流

提高效率,可以指定缓冲区大小 在这里插入图片描述

BufferedWriter输出

        BufferedWriter bw = new BufferedWriter(new FileWriter("我嫩爹.txt"));
        bw.write("哈哈哈哈");
        bw.flush();

BufferedReader 输入

        BufferedReader bw = new BufferedReader(new FileReader("我嫩爹.txt"));
        char[] cha = new char[1024];
        int ch= 0;
        while ((ch=bw.read(cha))!=-1){
            System.out.println(new String(cha,0,ch));
        }

字符缓冲流的特殊方法

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 readLine例子 注意:readLine是不带换行符的要带上newLine

IO小结图解

在这里插入图片描述

复制文本文件的五种案例方式

基本字符流一次读写一个字符

public static void metho(String src, String des) throws IOException {
        //基本字符流一次读写一个字符
        FileReader fr= new FileReader(src);//读入

        FileWriter s1 = new FileWriter(des);
        int ch=0;
        while((ch=fr.read())!=-1){
            s1.write(ch);
        }
        fr.close();;
        s1.close();
    }

基本字符流一次读写一个数组

    public static void metho1(String src, String des) throws IOException {
        FileReader fr= new FileReader(src);//读入

        FileWriter s1 = new FileWriter(des);
        char[]arr = new char[1024];
        int ch=0;
        while((ch=fr.read(arr))!=-1){
            s1.write(new String(arr ,0,ch));
        }
        fr.close();;
        s1.close();
    }

字符缓存流一次读写一个数组

public static void metho2(String src, String des) throws IOException {
        BufferedReader fr= new BufferedReader(new FileReader(src));//读入

        BufferedWriter s1 = new BufferedWriter(new FileWriter(des));
        char[]arr = new char[1024];
        int ch=0;
        while((ch=fr.read(arr))!=-1){
            s1.write(new String(arr ,0,ch));
        }
        fr.close();;
        s1.close();
    }

字符缓存流一次读写一个字符

    public static void metho4(String src, String des) throws IOException {
        //基本字符流一次读写一个字符
        BufferedReader fr= new BufferedReader(new FileReader(src));//读入

        BufferedWriter s1 = new BufferedWriter(new FileWriter(des));
        int ch=0;
        while((ch=fr.read())!=-1){
            s1.write(ch);
        }
        fr.close();;
        s1.close();
    }

字符缓存流一次读一行

 public static void metho5(String src, String des) throws IOException {
        //基本字符流一次读写一个字符
        BufferedReader fr= new BufferedReader(new FileReader(src));//读入

        BufferedWriter s1 = new BufferedWriter(new FileWriter(des));
        String line = null;
        while((line = fr.readLine())!=null){
            s1.write(line);
            s1.newLine();
            s1.flush();
        }
        fr.close();;
        s1.close();
    }

复制字节的四种基本案例

一次读写一个字节

    public static void metho(String src, String des) throws IOException {
        //一次读写一个字节
       FileInputStream s1 = new FileInputStream(src);
       FileOutputStream s2 = new FileOutputStream(des);
       int by = 0;
       while((by=s1.read())!=-1){
           s2.write(by);
       }
       s1.close();
       s2.close();
    }

一次读写一个字节数组

//一次读写一个字节数组
       FileInputStream s1 = new FileInputStream(src);
       FileOutputStream s2 = new FileOutputStream(des);
       byte[]arr= new byte[1024];

       int by = 0;
       while((by=s1.read(arr))!=-1){
           s2.write(arr,0,by);
       }
       s1.close();
       s2.close();

字节缓存流读取一个字节数组

    public static void metho(String src, String des) throws IOException {
    
       BufferedInputStream s1 = new BufferedInputStream(new FileInputStream(src));
       BufferedOutputStream s2 = new BufferedOutputStream(new FileOutputStream(des));
       byte[]arr= new byte[1024];

       int by = 0;
       while((by=s1.read(arr))!=-1){
           s2.write(arr,0,by);
       }
       s1.close();
       s2.close();
    }

字节缓存流读取一个字节

    public static void metho(String src, String des) throws IOException {
      
       BufferedInputStream s1 = new BufferedInputStream(new FileInputStream(src));
       BufferedOutputStream s2 = new BufferedOutputStream(new FileOutputStream(des));
 

       int by = 0;
       while((by=s1.read())!=-1){
           s2.write(by);
       }
       s1.close();
       s2.close();
    }

操作基本数据类型的流

在这里插入图片描述

在这里插入图片描述 使用例子

内存操作流

在这里插入图片描述 在这里插入图片描述 使用案例,内存操作流不需要写回收方法。

打印流

在这里插入图片描述 打印流是可以同时操作基本流和高级流 在这里插入图片描述

打印流作为子类循环的使用

在这里插入图片描述

打印流例子

在这里插入图片描述 效率相比之前更高效并且输出语句的本质就是打印流。

随机访问流

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 通过seek方法定位指针指针定位到哪就输出哪里。

合并流

    public static void main(String[] args) throws IOException {
        InputStream s1 = new FileInputStream("fbb.txt");
        InputStream s2 = new FileInputStream("fbb2.txt");
        SequenceInputStream sis = new SequenceInputStream(s1,s2);
        //该方法可以合并多个文本数据进行处理。
      
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("测试.txt"));
        byte[]by= new byte[1024];
        int ch =0;

        while ((ch=sis.read(by))!=-1){
            bos.write(by,0,ch);
        }
        bos.close();
        sis.close();
    }

在这里插入图片描述

添加多个文件的方法 在这里插入图片描述

序列化流

具体作用就是把一个对象写到文件,然后该对象就会变成流一样在文件中存储。将来还可以通过他把该对象还原 在这里插入图片描述

序列化步骤

在这里插入图片描述 读就叫序列化,写就叫反序列化 在这里插入图片描述

1 创建序列化对象 2 创建要序列化的对象 3 写序列化 4 释放资源 在这里插入图片描述 类要实现该接口才能启用序列化功能 在这里插入图片描述 该接口没有任何的方法,只是做一个标记的功能。

反序列号步骤

在这里插入图片描述

1 创建反序列化对象 2 还原对象 3 释放资源 4 输出对象 在这里插入图片描述 在这里插入图片描述 使用关键字让他不会被序列化

Properties的使用

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

Properties的特殊功能

在这里插入图片描述

Properties和IO流的结合使用

他可以直接把文本数据中的键值对存到集合中 他会自动处理切割到集合中 在这里插入图片描述 把集合中的数据存储到文件 在这里插入图片描述