JAVA输入输出流(IO流)

举报
代码不会敲 发表于 2022/05/08 13:09:53 2022/05/08
【摘要】 ​ 缓冲流缓冲流概述缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能​缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能字节缓冲流字节缓冲流自带8KB缓冲区,可以提高原始字节流、字符流读写数据的性能字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化。字...

 缓冲流

缓冲流概述

  • 缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
  • 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能


缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

字节缓冲流

字节缓冲流自带8KB缓冲区,可以提高原始字节流、字符流读写数据的性能

  • 字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化。
  • 字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能,读写功能上并无变化。

构造器

说明

public BufferedInputStream​(InputStream is)

可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能

public BufferedOutputStream(OutputStream os)

可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能

建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。

public class BufferInputTest1 {
    public static void main(String[] args) {
        try {
            InputStream is = new FileInputStream("D:\\test\\outputTest.txt");
            BufferedInputStream bis = new BufferedInputStream(is);

            OutputStream os = new FileOutputStream("D:\\test\\outputTest3.txt");
            OutputStream bos = new BufferedOutputStream(os);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


字符缓冲流

字符缓冲流自带8K缓冲区 可以提高原始字符流读写数据的性能

字符缓冲输入流:BufferedReader,性能提升了,多了readLine()按照行读取的功能

  • 作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。

字符缓冲输出流:BufferedWriter,  性能提升了,多了newLine()换行的功能

  • 作用:提高字符输出流写取数据的性能,除此之外多了换行功能

构造器

说明

public BufferedReader(Reader r)

可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能

public BufferedWriter​(Writer w)

可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

import java.io.*;

public class BufferReaderTest2 {
    public static void main(String[] args) {
        //1.创建一个字符输入流管道与文件接通
        try (Reader f = new FileReader("D:\\test\\outputTest.txt");
             //包装包装成一个高级的缓冲字符输入流管道
             BufferedReader bf = new BufferedReader(f);
        ){
            String s;
            while ((s = bf.readLine()) != null)
                System.out.println(s);

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


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;

public class BufferWriterTest3 {
    public static void main(String[] args) {
        //1.创建一个字符输出流管道与目标接通
        // 覆盖管道,每次启动都会清空文件之前的数据 true---追加数据,不覆盖
        try (Writer f = new FileWriter("D:\\test\\outputTest3.txt", true);
             //包装
             BufferedWriter bf = new BufferedWriter(f);
        ){
            bf.write("我爱中国!");
            bf.newLine();   //换行操作
            bf.write("我爱中国!!");
            bf.newLine();
            bf.write("我爱中国!!!");
            bf.newLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

转换流

可以解决乱码问题

  • 使用字符输入转换流
  • 可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
  • 然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
import java.io.*;

public class InputS {
    public static void main(String[] args) {
        //代码是utf-8格式-----读取其他格式会乱码
        File f = new File("D:\\test\\Read-GBK.txt");
        try (BufferedReader br = new BufferedReader(new FileReader(f))
        ) {
            String line;
            while ((line = br.readLine()) != null)
                System.out.println(line);

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


字符输入转换流  

字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

public InputStreamReader(InputStream is)

可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样。

public InputStreamReader(InputStream is ,String charset)

可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了

import java.io.*;

public class InputS2 {
    public static void main(String[] args) {
        //代码是utf-8格式-----读取其他格式会乱码
        //使用字符输入转换流解决乱码问题
        File f = new File("D:\\test\\Read-GBK.txt");
        try (InputStream is = new FileInputStream(f);
             Reader isr = new InputStreamReader(is, "GBK");
             BufferedReader br = new BufferedReader(isr)
        ) {
            String line;
            while ((line = br.readLine()) != null)
                System.out.println(line);

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

字符输出转换流

 字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流

可以把字符以指定编码获取字节后再使用字节输出流写出去: “我爱你中国”.getBytes(编码)

也可以使用字符输出转换流实现。

public OutputStreamWriter(OutputStream os)

可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。

public OutputStreamWriter(OutputStream os,String charset)

可以把原始的字节输出流按照指定编码转换成字符输出流

import java.io.*;

public class OutputS3 {
    public static void main(String[] args) throws Exception {
        //字节输出流
        OutputStream os = new FileOutputStream("D:\\test\\Read-GBK.txt", true);

        //以设定格式写入
        Writer osw = new OutputStreamWriter(os, "GBK");

        //包装成高级的字符缓冲流
        BufferedWriter bw = new BufferedWriter(osw);

        bw.write("中国我爱你!!!");
        bw.close();
    }
}


序列化对象

对象序列化

作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。对象必须实现序列化接口

对象序列化: 使用到的流是对象字节输出流:ObjectOutputStream

构造器

说明

public ObjectOutputStream(OutputStream out)

把低级字节输出流包装成高级的对象字节输出流

方法名称

说明

public final void writeObject(Object obj)

把对象写出去到对象序列化流的文件中去

import java.io.Serializable;

//对象要序列化,必须要实现Serializable接口
public class People implements Serializable {
    private static final long serialVersionUID = 1; //声明序列化的版本号
    private String name;
    private int age;
    // private transient int passwd;    //transient修饰的变量不参与序列化

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public People(){

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectOutputS {
    public static void main(String[] args) throws Exception {
        People p = new People("小明", 20);

        //对象序列化
        ObjectOutputStream oos  = new ObjectOutputStream(new FileOutputStream("D:\\test\\outputTest4.txt"));
        //调用序列化方法
        oos.writeObject(p);

        //资源释放
        oos.close();

    }
}

对象反序列化

作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。

使用到的流是对象字节输入流:ObjectInputStream

构造器

说明

public ObjectInputStream(InputStream out)

把低级字节输如流包装成高级的对象字节输入流

方法名称

说明

public Object readObject()

把存储到磁盘文件中去的对象数据恢复成内存中的对象返回

import java.io.FileInputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;

public class ObjectInputS2 {
    public static void main(String[] args) throws Exception {
        //1.创建对象字节输入流
        ObjectInput is = new ObjectInputStream(new FileInputStream("D:\\test\\outputTest4.txt"));

        //2.使用对象字节输入流的反对象序列化
        People p = (People) is.readObject();
        is.close();

        System.out.println(p);
    }
}



打印流

PrintStream、PrintWriter

作用:打印流可以实现方便、高效的打印数据到文件中去。两者在打印功能上都是使用方便,性能高效(核心优势)

打印流一般是指:PrintStream,PrintWriter两个类。

  • PrintStream继承自字节输出流OutputStream,支持写字节
  • PrintWrite继承自字符输出流Writer,支持写字符

可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。

构造器

说明

public PrintStream(OutputStream os)

打印流直接通向字节输出流管道

public PrintStream(File  f)

打印流直接通向文件对象

public PrintStream(String filepath)

打印流直接通向文件路径

方法

说明

public void print(Xxx xx)

打印任意类型的数据出去

import java.io.PrintStream;

public class PrintS {
    public static void main(String[] args) throws Exception {
        //1.创建一个打印流对象
        PrintStream ps = new PrintStream("D:\\test\\outputTest5.txt");

        ps.println(111);
        ps.println("aaaaa");
        ps.println("看到这句话的都是大哥");
        ps.close();
    }
}

 输出语句的重定向

属于打印流的一种应用,可以把输出语句的打印位置改到文件

PrintStream ps = new PrintStream("文件地址");
System.setOut(ps);
import java.io.PrintStream;

public class PrintS2 {
    public static void main(String[] args) throws Exception {
        PrintStream ps = new PrintStream("D:\\test\\outputTest6.txt");
        System.setOut(ps);
        System.out.println("你好!!");
        System.out.println("我是xxx!!");
        System.out.println("啦啦啦啦!!");
        System.out.println("啦啦啦!!");
        System.out.println("啦啦!!");
        ps.close();
    }
}

​在此页面也可查看

https://blog.csdn.net/weixin_57780057/article/details/124571294?spm=1001.2014.3001.5501

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。