fileinputstream是java中用于读取文件原始字节的输入流,适用于二进制文件;支持单字节read()和批量read(byte[])两种方式,需循环读取并注意-1结束标识;必须用try-with-resources或finally关闭资源,避免ioexception;大文件推荐流式读取,小文件可优先使用files.readallbytes()。

FileInputStream 是 Java 中用于从文件读取原始字节数据的输入流类,适合处理二进制文件(如图片、音频、PDF)或需要精确控制字节读取的场景。
基本用法:一次读一个字节
调用 read() 方法每次读取一个字节,返回 0~255 的 int 值,读到文件末尾时返回 -1:
- 适用于小文件或教学演示,但效率低,不推荐用于大文件
- 注意:返回的是 int 而非 byte,避免符号扩展问题(例如 0xFF 会被转成 -1)
常用方式:批量读取到字节数组
更高效的做法是使用 read(byte[] b) 或 read(byte[] b, int off, int len):
- 返回实际读取的字节数(可能小于数组长度),同样以 -1 表示结束
- 需配合 while 循环,不能只调用一次就认为读完了
- 示例:
byte[] buf = new byte[8192]; int n; while ((n = fis.read(buf)) != -1) { /* 处理 buf[0] 到 buf[n-1] */ }
关键注意事项
使用 FileInputStream 时必须关注资源管理和异常处理:
- 务必在 finally 块中调用 close(),或使用 try-with-resources 自动关闭
- 构造时若文件不存在或无权限,会抛出 FileNotFoundException
- 读取过程中发生 I/O 错误会抛出 IOException
- 不要对同一个 FileInputStream 实例重复调用 close(),否则会抛出异常
替代建议:优先考虑 NIO.2(Files 类)
对于简单读取整个文件内容,Java 7+ 推荐使用 Files.readAllBytes(Path) 或 Files.readAllLines(Path):
- 代码更简洁,自动处理资源和异常
- 底层仍可能使用 FileInputStream,但封装更安全
- 仅适用于内存能容纳整个文件的场景;超大文件仍需流式读取
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











