Java中FileInputStream的read()方法代码示例详解

 更新时间:2026年03月05日 11:43:32   作者:Stronger划水高手  
文章总结Java中FileInputStream的两个read()方法的区别,通过对比两种方法的使用场景、关键点和设计原因,强调了批量读取在实际生产环境中的重要性,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

我发现java中的FileInputStream的read()方法,通过字节数组读取和字节读取,一个是返回读取字节的长度,一个是返回字节代表的值。

这是 FileInputStream 两个 read() 方法的核心区别,直接决定了使用场景:

两个read()方法对比

方法签名返回值作用使用场景
int read()0-255 的字节值,或 -1(文件结束)逐字节读取小文件、简单演示、需要逐字节处理
int read(byte[] b)实际读取的字节数(0 到 b.length),或 -1(文件结束)批量读取到缓冲区大文件、高效处理、网络传输

代码示例对比

1. 逐字节读取(返回字节值)

FileInputStream fis = new FileInputStream("test.txt");
int data;  // 注意是 int,不是 byte!
while ((data = fis.read()) != -1) {
    // data 是 0-255 的字节值,或 -1 表示结束
    System.out.print((char) data);  // 转为字符显示
}
fis.close();

关键点

  • 返回值 int 是为了兼容 -1byte 范围是 -128~127,无法表示 -1)
  • 每次只读 1 个字节,效率极低

2. 批量读取(返回读取长度)

FileInputStream fis = new FileInputStream("test.txt");
byte[] buffer = new byte[1024];  // 1KB 缓冲区
int bytesRead;  // 实际读到的字节数
while ((bytesRead = fis.read(buffer)) != -1) {
    // bytesRead 告诉本次读了多少字节(可能 < 1024)
    String chunk = new String(buffer, 0, bytesRead, "UTF-8");
    System.out.print(chunk);
}
fis.close();

关键点

  • buffer 是"容器",方法把数据填充进去
  • bytesRead 告诉你实际装了多少(最后一次可能不满)
  • 必须用 new String(buffer, 0, bytesRead)不能用全部 buffer,否则末尾有垃圾数据

为什么这样设计?

设计原因解释
逐字节返回 int需要区分 0-255 的有效字节-1 的结束标志byte 无法做到
批量返回长度数组已经装了数据,只需告诉"装了多少",避免重复拷贝
减少系统调用批量读一次磁盘,比逐字节读 1024 次快 100 倍以上

常见错误

// ❌ 错误:忽略 bytesRead,直接用整个 buffer
while (fis.read(buffer) != -1) {
    String s = new String(buffer);  // 末尾可能有上次残留的垃圾!
}
// ✅ 正确:只用读到的前 bytesRead 个字节
while ((bytesRead = fis.read(buffer)) != -1) {
    String s = new String(buffer, 0, bytesRead, "UTF-8");
}

一句话总结

  • read()“给我一个字节”,返回那个字节的值(或 -1 结束)
  • read(byte[])“给我一堆字节,装这个数组里”,返回装了多少个(或 -1 结束)

批量读是生产环境唯一选择,逐字节读只用来学习原理或处理极小文件。

到此这篇关于Java中FileInputStream的read()方法代码示例详解的文章就介绍到这了,更多相关java fileInputstream的read()方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot Test详解

    Spring Boot Test详解

    Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段,而Spring Boot Test 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力,这篇文章主要介绍了Spring Boot Test介绍,需要的朋友可以参考下
    2024-02-02
  • mybatis多对多查询的实现(xml方式和注解方式)

    mybatis多对多查询的实现(xml方式和注解方式)

    本文主要介绍了mybatis多对多查询的实现,有xml方式和注解方式两种,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Spring中单例和多例的深入理解

    Spring中单例和多例的深入理解

    这篇文章主要介绍了Spring中单例和多例的深入理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis实现插入大量数据方法详解

    MyBatis实现插入大量数据方法详解

    最近在公司项目开发中遇到批量数据插入或者更新,下面这篇文章主要给大家介绍了关于MyBatis实现批量插入的相关资料,需要的朋友可以参考下
    2022-11-11
  • Java中Integer的parseInt和valueOf的区别详解

    Java中Integer的parseInt和valueOf的区别详解

    这篇文章主要介绍了Java中Integer的parseInt和valueOf的区别详解,nteger.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,需要的朋友可以参考下
    2023-11-11
  • 打造一款代码命名工具的详细教程

    打造一款代码命名工具的详细教程

    这篇文章主要介绍了来,我们一起打造一款代码命名工具,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot实现HTTP服务监听的代码示例

    SpringBoot实现HTTP服务监听的代码示例

    前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例,需要的朋友可以参考下
    2023-05-05
  • Java中Date和LocalDate区别与介绍

    Java中Date和LocalDate区别与介绍

    本文主要介绍了Java中Date和LocalDate区别与介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 手把手教你SpringBoot快速集成Swagger的配置过程

    手把手教你SpringBoot快速集成Swagger的配置过程

    这篇文章主要介绍了手把手教你SpringBoot快速集成Swagger的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • SpringBoot实现调用自定义的应用程序((最新推荐)

    SpringBoot实现调用自定义的应用程序((最新推荐)

    这篇文章主要介绍了SpringBoot实现调用自定义的应用程序的相关知识,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06

最新评论