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 拦截器帮助解锁5种常用场景(推荐)

    Spring Boot 拦截器帮助解锁5种常用场景(推荐)

    在SpringBoot中,拦截器用于在请求处理前后插入自定义逻辑,实现权限校验、日志记录、性能监控等功能,本文给大家介绍Spring Boot 拦截器帮助解锁5大实用场景,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Spring中@Cacheable注解的使用详解

    Spring中@Cacheable注解的使用详解

    这篇文章主要介绍了Spring中@Cacheable注解的使用详解,Spring框架提供了@Cacheable注解来轻松地将方法结果缓存起来,以便在后续调用中快速访问,本文将详细介绍@Cacheable注解的使用方法,并从源码级别解析其实现原理,需要的朋友可以参考下
    2023-11-11
  • java项目中classpath指向哪里

    java项目中classpath指向哪里

    这篇文章介绍了java项目中classpath指向哪里及工作原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 解决springcloud-eureka注册时的ip问题

    解决springcloud-eureka注册时的ip问题

    这篇文章主要介绍了解决springcloud-eureka注册时的ip问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java使用Alibaba Druid数据库连接池的技术指南

    Java使用Alibaba Druid数据库连接池的技术指南

    Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成,它不仅支持高效的连接管理,还集成了 SQL 监控、日志输出和多种扩展功能,本文将从 Druid 的基本概念出发,结合具体样例,带你全面掌握 Druid 的配置与使用,需要的朋友可以参考下
    2025-03-03
  • spring mvc 组合mybatis框架实例详解

    spring mvc 组合mybatis框架实例详解

    本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据。对spring mvc 组合mybatis的方法感兴趣的朋友可以参考下本文
    2018-01-01
  • Java实现在Word文档中添加批注的示例代码

    Java实现在Word文档中添加批注的示例代码

    在现代办公环境中,Word文档已成为信息传递和协作的重要载体,本教程将深入探讨如何利用Java实现Word文档批注的自动化添加,感兴趣的小伙伴可以了解下
    2025-10-10
  • java之多线程抢火车票的实现示例

    java之多线程抢火车票的实现示例

    生活中有很多多线程的案例,购票就是一个很常见的问题,本文主要介绍了java之多线程抢火车票的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Maven scala和java混合打包方式

    Maven scala和java混合打包方式

    这篇文章主要介绍了Maven scala和java混合打包方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • RabbitMQ中的Connection和Channel信道详解

    RabbitMQ中的Connection和Channel信道详解

    这篇文章主要介绍了RabbitMQ中的Connection和Channel信道详解,信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的,需要的朋友可以参考下
    2023-08-08

最新评论