当前位置 博文首页 > 立志欲坚不欲锐,成功在久不在速度:IO流 - InputStream 和 Outp

    立志欲坚不欲锐,成功在久不在速度:IO流 - InputStream 和 Outp

    作者:[db:作者] 时间:2021-07-31 14:57

    上一篇博客已经给大家介绍过什么是IO流,其中也提到了关于IO流的分类???点击链接查看博客-------->??什么是IO流

    这篇博客主要了解关于Java标准库提供的最基本的输入输出流:? ?InputStream 、?OutputStream

    一、InputStream:

    ? ? ? ? ? ? ? ? ? ? ? ?是Java提供的最基本的输入流,这个并不是一个接口而是一个抽象类

    ? ? ? ? ? ? ? ? ? ? ? ?这个类中最重要的方法就是?int read() :?读取输入流的下一个字节,并且返回字节表示的int值,返回-1表示到末尾不能继续读取了

    😎? InputStream的基本用法:

    1.//读取一个字节并以整数的形式返回(0~255),如果返回-1说明已经到输入流的末尾无法继续读取

    int read() throws IOException

    2.读取一系列字节,并存储到一个数组buffer中,?返回实际读取的字节数,如果读取前已经到输入流的末尾返回-1

    int read(byte[] buffer) throws IOException

    3.读取length个字节,并存储到一个字节数组buffer,从length位置开始,返回实际读取的字节数

    int read(byte[] buffer,int offset, int length) throws IOException

    4.关闭流释放内存资源

    void close() throws IOException

    ?😎 inputStream中最常用的一个子类:? ?FileInputStream?

    顾名思义FileInputStream就是从文件流中读取数据,我们通过一个例子来延时如何完整的读取一个File的所有字节

    public void readFile() throws IOException {
        //创建一个FileInputStream 对象
        InputStream input = new FileInputStream("src/readme.txt");
        for(;;){
            int n=input.read();//反复调用read()方法,直到返回-1 
            if(n == -1){
            break;
            }
            System.out.println(n);//打印byte的值
            }
            input.close()//关闭流
     
        }
    
    //修改后的写法:因为上面的方法当出现异常的时候无法执行close
    
    public void readFile() throws IOException {
        InputStream input = null;
        try {
            input = new FileInputStream("src/readme.txt");
            int n;
            while ((n = input.read()) != -1) { // 利用while同时读取并判断
                System.out.println(n);
            }
        } finally {
            if (input != null) { input.close(); }
        }
    }

    通过例子我们发现最后使用了?input.close?来关闭流,为什么要关闭流?

    应用程序在运行的过程中,如果打开了一个文件进行读写,完成后要及时地关闭,以便让操作系统把资源释放掉,否则,应用程序占用的资源会越来越多,不但白白占用内存,还会影响其他应用程序的运行。

    😎 缓冲区:

    我们上面读取流的时候,每次只能读取一个字节,这样的效率很低。

    我们可以利用InputStream提供的两个重载方法来支持读取多个字节

    int read(byte[] b);  //读取若干字节并填充到byte[]数组,返回读取的字节数
    int read(byte[] b, int off, int len); //指定byte[] 数组的偏移量 和最大填充数

    例子:

    public void readFile() throws IOException {
        try (InputStream input = new FileInputStream("src/readme.txt")) {
            // 定义1000个字节大小的缓冲区:
            byte[] buffer = new byte[1000];
            int n;
            while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
                System.out.println("read " + n + " bytes.");
            }
        }
    }

    二、OutputStream?输出流

    🍁 OutputStream的重要方法:

    public abstract void write(int b) throws IOException

    局限性: 这个方法会写入一个字节到输入流。

    对于close的用法?OutputStream和InputStream的用法一样

    特别注意:OutputStream提供了一个flush()方法,目的是将缓冲区的内容真正的输出到目的地

    其中OutputStream中的子类?FileOutputStream?

    🍁FileOutputStream的基本用法:

    FileOutputStream的例子:将若干字节写入文件流

    public void writeFile() throws IOException{
        OutputStream output = new FileOutputStream("out/readme.txt");
        output.write(72); //H
        output.write(101);//e
        output.write(108);//I
        output.close();
    }

    但是每次只能写入一个字节,太麻烦了,我们有一个好的重载方法

    void Write(byte[]) ;

    public void writeFile() throws IOException {
        try (OutputStream output = new FileOutputStream("out/readme.txt")) {
            output.write("Hello".getBytes("UTF-8")); // Hello
        } // 编译器在此自动为我们写入finally并调用close()
    }

    ?

    cs