java 中读取文件为字节数组最直接的方法是使用 java.nio.file.files 类的静态方法 readallbytes()。只需传入一个由 path 对象表示的文件路径,该方法就会将文件内容全部加载到内存中并返回一个 byte[] 数组。需要注意的是,此方法适用于小文件,因为大文件会占用大量堆内存。

Files.readAllBytes() 的输入与返回值结构
调用 Files.readAllBytes() 时,输入参数必须是有效的 Path 对象,且该路径指向一个可读的文件。如果文件不存在或无法访问,方法会抛出 IOException。成功执行后,返回值是一个包含文件所有字节的 byte[] 数组,其长度等于文件的字节大小。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileReadExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
byte[] data = Files.readAllBytes(path);
System.out.println("Read " + data.length + " bytes.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Files.readAllBytes() 处理空文件与大文件的差异
当文件为空时,Files.readAllBytes() 不会报错,而是返回一个长度为 0 的空字节数组 new byte[0]。对于大文件,虽然方法依然能返回完整的字节数组,但会导致 JVM 堆内存压力剧增,甚至引发 OutOfMemoryError。因此,在处理可能超过几兆字节的大文件时,应改用 InputStream 流式读取,而不是使用 readAllBytes()。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class LargeFileCheck {
public static void main(String[] args) {
Path emptyPath = Paths.get("empty.txt");
try {
byte[] emptyData = Files.readAllBytes(emptyPath);
System.out.println("Empty file size: " + emptyData.length); // Output: 0
} catch (IOException e) {
e.printStackTrace();
}
}
}
基于 Files.readAllBytes() 返回的 byte[] 数组的具体问题
获取到的 byte[] 数组可以直接用于后续处理,例如转换为字符串、写入其他文件或进行加密操作。如果需要对内容进行文本解析,必须指定正确的字符集(如 UTF-8)来构造 String 对象,否则可能出现乱码。此外,由于 readAllBytes() 是一次性加载,确保在读取完成后及时释放引用,有助于垃圾回收器回收内存。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











