Java字节流文件读写本质是绕过字符编码直接操作二进制数据,核心类为FileInputStream和FileOutputStream,需显式关闭或用try-with-resources,推荐缓冲读写并明确指定编码。

Java 中用字节类型数据进行底层文件读写,本质是绕过字符编码、直接操作原始二进制数据。这种方式不关心内容是不是文本,而是把文件当作一串连续的 byte(0–255),适用于所有文件类型——文本、图片、音频、压缩包等。
核心类:FileInputStream 和 FileOutputStream
这两个类是字节流最基础的实现,分别负责从文件读字节、向文件写字节。
- FileInputStream 继承自 InputStream,构造时传入 File 或文件路径,调用 read() 方法获取字节(返回 int,实际是 byte 转成无符号整数)
- FileOutputStream 继承自 OutputStream,构造时指定目标文件,调用 write(int) 或 write(byte[]) 把字节写入磁盘
- 二者都必须显式关闭,或使用 try-with-resources 自动释放资源,否则可能造成句柄泄漏
读取文件:按块读比逐字节更高效
逐字节读(fis.read())逻辑简单但性能差;推荐用字节数组缓冲批量读取,避免频繁系统调用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建合适大小的 byte[],如
new byte[8192](8KB)是常见选择 - 用
fis.read(buffer)返回实际读到的字节数,不是数组长度 - 处理时只取
buffer[0] 到 buffer[len-1],防止残留旧数据干扰 - 对文本文件,若需转字符串,应明确指定编码,例如
new String(buffer, 0, len, "UTF-8"),避免依赖平台默认编码出错
写入文件:注意覆盖与追加模式
FileOutputStream 构造器第二个 boolean 参数决定写入方式:
立即学习“Java免费学习笔记(深入)”;
-
new FileOutputStream("a.txt", false):默认覆盖原文件(false 可省略) -
new FileOutputStream("a.txt", true):在末尾追加,适合日志类场景 - 写入后建议调用
fos.flush()强制刷出缓冲区(尤其非 try-with-resources 场景),确保数据真正落盘 - 字符串转字节要显式编码,例如
"你好".getBytes(StandardCharsets.UTF_8),避免用无参 getBytes() 隐含平台编码风险
实际读写示例(带异常处理)
以下是一个安全、可复用的字节文件复制方法:
(使用 try-with-resources,自动关闭流)public static void copyFile(String srcPath, String dstPath) throws IOException {
try (FileInputStream fis = new FileInputStream(srcPath);
FileOutputStream fos = new FileOutputStream(dstPath)) {
byte[] buf = new byte[4096];
int len;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
}
}

















