java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java fileInputstream的read()方法

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();

关键点

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();

关键点

为什么这样设计?

设计原因解释
逐字节返回 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()方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文