Java中FileInputStream的read()方法代码示例详解
作者: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是为了兼容 -1(byte范围是 -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()方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
