java读写二进制文件应使用inputstream/outputstream,避免字符编码转换;需用try-with-resources自动关流,按返回值判断读取长度,不可用reader/writer或string.getbytes()无参方法。

Java 中用 InputStream 和 OutputStream 读写二进制文件,核心是“不经过字符编码转换”,直接按字节搬运数据。只要不套用 Reader/Writer,不指定字符集,就不会出错。
读取二进制文件:用 FileInputStream
直接把文件内容原样读成字节数组或逐块读入缓冲区:
- 推荐用带缓冲的
FileInputStream+byte[]数组(比如 8192 字节),避免单字节读取性能差 - 调用
read(byte[] b)返回实际读到的字节数,需用返回值判断是否读完,不能只看数组长度 - 读到
-1表示流末尾,不是错误
写入二进制文件:用 FileOutputStream
把字节数组或字节块原样写入文件,不添加换行、不转义、不编码:
- 创建
FileOutputStream时可传true开启追加模式(默认覆盖) - 用
write(byte[] b)或write(byte[] b, int off, int len)精确控制写入范围 - 写完必须调用
close()或用 try-with-resources,否则可能丢数据
安全高效写法:用 try-with-resources 自动关流
避免忘记关闭导致句柄泄漏或数据未刷盘:
- 输入输出流都支持自动关闭,可写在同一个 try() 中
- 缓冲流(如
BufferedInputStream)能提升大文件读写速度,但非必需 - 不需要手动调用
flush()——FileOutputStream的write()是直接落盘的;只有带缓冲的流(如BufferedOutputStream)才需要 flush
常见误区提醒
容易踩坑的地方:
- 误用
String.getBytes()时不指定字符集,不同系统默认编码不同,会导致二进制内容被污染 - 把图片、音频等文件用
FileReader读 —— 这会按字符解码,严重破坏原始字节 - 用
readLine()或nextLine()处理二进制流 —— 它们依赖换行符和字符边界,对二进制无效 - 忽略
read()返回值,直接把整个缓冲区当有效数据处理,造成末尾脏数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











