当前位置: 代码网 > it编程>编程语言>Java > Java中FileInputStream的read()方法代码示例详解

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

2026年03月05日 Java 我要评论
我发现java中的fileinputstream的read()方法,通过字节数组读取和字节读取,一个是返回读取字节的长度,一个是返回字节代表的值。这是 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()方法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com