Java 基础教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java BufferedInputStream 类

在本教程中,我们将借助示例学习Java BufferedInputStream及其方法。

java.io包的BufferedInputStream类与其他输入流一起使用,以更有效地读取数据(以字节为单位)。

它继承了InputStream抽象类。

BufferedInputStream类是Java InputStream的子类。

BufferedInputStream的工作原理

BufferedInputStream维护一个8192字节的内部缓冲区。

在BufferedInputStream中进行读取操作期间,会从磁盘读取一部分字节并将其存储在内部缓冲区中。 并从内部缓冲区中逐个读取字节。

因此,减少了与磁盘的通信次数。这就是为什么使用BufferedInputStream读取字节更快。

创建一个BufferedInputStream

为了创建一个BufferedInputStream,我们必须首先导入java.io.BufferedInputStream包。导入包后,便可以在此处创建输入流。

//创建一个FileInputStream
FileInputStream file = new FileInputStream(String path);

//创建一个BufferedInputStream
BufferedInputStream buffer = new BufferInputStream(file);

在上面的示例中,我们创建了一个名为BufferdInputStream的buffer,并使用名为file的FileInputStream创建了一个文件。

在此,内部缓冲区的默认大小为8192字节。但是,我们也可以指定内部缓冲区的大小。

//创建一个具有指定大小的内部缓冲区的BufferedInputStream
BufferedInputStream buffer = new BufferInputStream(file, int size);

buffer将有助于更快地从文件读取字节。

BufferedInputStream的方法

BufferedInputStream类为InputStream类中提供的不同方法提供实现。

read()方法

  • read() - 从输入流中读取一个字节

  • read(byte[] arr) - 从流中读取字节并存储在指定的数组中

  • read(byte[] arr, int start, int length) - 从流中读取等于length的字节数,并从位置start开始存储在指定的数组中

假设我们有一个名为input.txt的文件,其中包含以下内容。

This is a line of text inside the file.

让我们尝试使用读取文件BufferedInputStream。

import java.io.BufferedInputStream;
import java.io.FileInputStream;

class Main {
    public static void main(String[] args) {
        try {

            //创建一个FileInputStream
            FileInputStream file = new FileInputStream("input.txt");

            //创建一个BufferedInputStream
            BufferedInputStream input = new BufferedInputStream(file);

            //从文件中读取第一个字节
            int i = input .read();

            while (i != -1) {
                System.out.print((char) i);

                //从文件中读取下一个字节
                i = input.read();
            }
            input.close();
        }

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

输出结果

This is a line of text inside the file.

在上面的示例中,我们创建了一个名为buffer的缓冲输入流和FileInputStream。输入流与文件input.txt链接。

FileInputStream file = new FileInputStream("input.txt");
BufferedInputStream buffer = new BufferedInputStream(file);

在这里,我们使用了read()方法从缓冲读取器的内部缓冲区读取字节数组。

available()方法

要获取输入流中可用字节的数量,我们可以使用available()方法。例如,

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

   public static void main(String args[]) {

      try {

        //假设input.txt文件包含以下文本
        //这是文件中的一行文本。
         FileInputStream file = new FileInputStream("input.txt");
         
         //创建一个BufferedInputStream
         BufferedInputStream buffer = new BufferedInputStream(file);

         //返回可用的字节数
         System.out.println("开始时可用的字节数: " + buffer.available());

         //从文件中读取字节
         buffer.read();
         buffer.read();
         buffer.read();

         //返回可用的字节数
         System.out.println("结束时的可用字节数: " + buffer.available());

         buffer.close();
      }

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

输出结果

开始时可用的字节数: 39
结束时的可用字节数: 36

在以上示例中,

  1. 我们首先使用available()方法检查输入流中可用字节的数量。

  2. 然后,我们使用read()方法3次从输入流中读取3个字节。

  3. 现在,在读取字节之后,我们再次检查了可用字节。这一次可用字节减少了3。

skip()方法

要丢弃和跳过指定的字节数,可以使用skip()方法。例如

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

   public static void main(String args[]) {

      try {
        //假设input.txt文件包含以下文本
        //这是文件中的一行文本。
         FileInputStream file = new FileInputStream("input.txt");

         //创建一个BufferedInputStream
         BufferedInputStream buffer = new BufferedInputStream(file);

         //跳过5个字节
         buffer.skip(5);
         System.out.println("跳过5个字节后的输入流:");

         //从输入流中读取第一个字节
         int i = buffer.read();
         while (i != -1) {
            System.out.print((char) i);

            //从输入流中读取下一个字节
            i = buffer.read();
         }

         //关闭输入流
         buffer.close();
      }

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

输出结果

跳过5个字节后的输入流: is a line of text inside the file.

在上面的示例中,我们使用过skip()方法从文件输入流中跳过5个字节。 因此,从输入流中跳过字节“ T”,“ h”,“ i”,“ s”和“ ”。

close()方法

要关闭缓冲的输入流,我们可以使用close()方法。 一旦调用close()方法,我们将无法使用输入流读取数据。

BufferedInputStream的其他方法

方法内容描述
mark()标记输入流中已读取数据的位置
reset()将控件返回到输入流中设置了标记的点