Java基础之字节输入流

138 阅读3分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

1.0 字节输入流(读数据)

  • 父类:InputStream(抽象类)

  • java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

  • public abstract int read(): 从输入流读取数据的下一个字节。

  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中

  • 子类:FileInputStream(实现类:从文件系统中的文件获取输入字节)

  • 构造方法

方法名说明
public FileInputStream(File path)创建一个字节输入流管道与源文件对象接通
public FileInputStream(String pathName)创建一个字节输入流管道与文件路径对接
  • 方法
方法名说明
public int read()每次读取一个字节返回!读取完毕会返回 -1
public int read(byte[] buffer)从字节输入流中读取字节到字节数组中去,返回读取的字节数量,没有字节可读返回 -1
  • 使用字节输入流读数据的步骤
    • 1、创建字节输入流对象
    • 2、调用字节输入流对象的读数据方法
    • 3、释放资源
  • 范例
package test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        // 1、创建字节输入流对象
        FileInputStream fis = new FileInputStream("E:\\test\\fos.txt");

        //2、调用字节输入流对象的读数据方法
        //int read():从该输入流读取一个字节数据
        //第一次读取数据
        /*int by = fis.read();
        System.out.println(by); //97,表示a
        System.out.println((char)by); //a

        //第二次读取数据
        by = fis.read();
        System.out.println(by); //98
        System.out.println((char)by); //b

        //再多读取两次
        by = fis.read();
        System.out.println(by); //-1,表示没有数据了
        by = fis.read();
        System.out.println(by); //-1*/

        //循环改进
        /*int by = fis.read();
        while(by != -1) {
            System.out.print((char)by); //ab
            by = fis.read();
        }*/

        //优化循环
        int by;
        //1、先做了读数据fis.read();2、赋值by=fis.read();3、与by 与 -1比较
        while((by=fis.read()) != -1) {
            System.out.print((char)by); //ab
        }
        
        //3、释放资源
        fis.close();
    }
}

1.1 字节缓冲流

  • 缓冲流可以提高字节流和字符流的读写数据的性能

  • 字节缓冲流

    • BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
    • BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流, 应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
  • 构造方法

    • 字节缓冲输入流:BufferedInputStream(InputStream in)
    • 字节缓冲输出流:BufferedOutputStream(OutputStream out)
  • 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

    • 字节缓冲流仅仅提供缓冲区, 而真正的读写数据还得依靠基本的字节流对象进行操作
  • 范例

package test;

import java.io.*;

public class BufferStreamDemo {
    public static void main(String[] args) throws IOException {

        //字节缓冲输出流:BufferedOutputStream(OutputStream out)
        /*FileOutputStream fos = new FileOutputStream("E:\\test\\fos.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);*/

        /*BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test\\fos.txt"));

        //写数据
        bos.write("hello\r\n".getBytes());
        bos.write("java\r\n".getBytes());

//        hello
//        java
        bos.close();*/

        //字节缓冲输入流:BufferedInputStream(InputStreamin)
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\test\\fos.txt"));

        int by;
        while((by=bis.read()) != -1) {
            System.out.print((char)by);
//            hello
//            java
        }

        bis.close();
    }
}