当前位置: 首页 > news >正文

JAVA中的缓冲流BufferedInputStream

在Java中,BufferedInputStream 是一种用于包装其他输入流(如 FileInputStream)的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数,因为每次从输入流读取数据时,BufferedInputStream 会尝试读取更多的数据放入缓冲区,后续的读取操作可以直接从缓冲区获取数据,从而减少了磁盘I/O操作的次数。 以下是 BufferedInputStream 的几个关键点

  • 内部维护一个缓冲区,默认大小为8192字节(8KB)。
  • 当缓冲区为空时,会从底层输入流中读取更多的数据填充缓冲区。
  • 当调用 close() 方法时,它也会关闭底层输入流。

下面是一个使用 BufferedInputStream 的示例代码:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamExample {public static void main(String[] args) {// 文件路径,这里假设有一个名为example.txt的文件String filePath = "example.txt";// 创建FileInputStream对象用于读取文件FileInputStream fileInputStream = null;// 创建BufferedInputStream对象,包装FileInputStreamBufferedInputStream bufferedInputStream = null;try {// 初始化FileInputStreamfileInputStream = new FileInputStream(filePath);// 初始化BufferedInputStream,可以指定缓冲区大小,这里使用默认大小bufferedInputStream = new BufferedInputStream(fileInputStream);// 读取文件内容byte[] buffer = new byte[1024]; // 1KB的缓冲区int bytesRead = 0; // 读取的字节数// 循环读取数据,直到文件末尾while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {// 将读取的数据转换为字符串并打印String data = new String(buffer, 0, bytesRead);System.out.print(data);}} catch (IOException e) {e.printStackTrace();} finally {// 关闭流if (bufferedInputStream != null) {try {bufferedInputStream.close(); // 关闭BufferedInputStream也会关闭底层的FileInputStream} catch (IOException e) {e.printStackTrace();}}}}
}

代码解释:

  1. 创建了一个 FileInputStream 对象用于从文件读取原始字节流。

  2. 创建了一个 BufferedInputStream 对象,将 FileInputStream 作为参数传递给其构造器,这样 BufferedInputStream 就会包装 FileInputStream

  3. 在一个循环中,使用 read 方法从 BufferedInputStream 中读取数据到缓冲区,并检查返回值是否为 -1(表示文件末尾)。

  4. 将读取的字节数据转换为字符串并打印出来。

  5. 使用 finally 块确保在程序结束前关闭 BufferedInputStream,它会自动关闭被包装的 FileInputStream。 请注意,从Java 7开始,可以使用try-with-resources语句简化资源管理,这样就不需要显式地关闭流了。以下是使用try-with-resources的示例:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamExample {public static void main(String[] args) {// 文件路径String filePath = "example.txt";// 使用try-with-resources语句自动管理资源try (FileInputStream fileInputStream = new FileInputStream(filePath);BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {String data = new String(buffer, 0, bytesRead);System.out.print(data);}} catch (IOException e) {e.printStackTrace();}}
}

在这个改进的版本中,FileInputStream 和 BufferedInputStream 都在try-with-resources的括号内声明,这样它们在try块执行完毕后就会自动关闭。

http://www.lryc.cn/news/425084.html

相关文章:

  • WindowContainerTransaction类详解(一)
  • 安装NFS扩展
  • 计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
  • 代码随想录算法训练营第一天 | 二分查找
  • python相关知识
  • Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录
  • Java高并发处理机制
  • 7 数据存储单位,整型、浮点型、字符型、布尔型数据类型,sizeof 运算符
  • 导游职业资格考试真题题库
  • 【Rust】使用开源项目搭建瓦片地图服务
  • 【面试宝典】mysql常见面试题总结(上)
  • 第1章 初识C语言
  • 【考研数学】定积分应用——旋转体体积的计算(一文以蔽之)
  • PHP移动端商城分销全平台全端同步使用
  • TLE8386-2EL:汽车级DC-DC转换器中文资料书
  • EasyRecovery17中文mac苹果电脑版数据恢复软件 永久免费破解版下载
  • Ubuntu 22.04 安装 VirtualBox7
  • NPM使用教程:从入门到精通
  • 模电实验3 - 单电源集成运放交流耦合放大器
  • 海对外经贸大学学报
  • 数字化营销在公域场景中的无限可能
  • 聚观早报 | 一加13配置细节曝光;谷歌首推人工智能手机
  • C++ 11相关新特性(lambda表达式与function包装器)
  • FastAPI部署大模型Llama 3.1
  • C++拾趣——编译器预处理宏__COUNTER__的应用场景
  • 使用HTML和cgi实现网页登录功能
  • Java流程控制01:用户交互Scanner
  • 什么是回滚
  • Java项目通过IDEA远程debug调试
  • Python 绘图入门