Java java.nio.file.Files size() 方法
java.nio.file.Files.size()
是 Java NIO (New I/O) 包中一个非常实用的静态方法,用于获取指定文件的大小(以字节为单位)。这个方法属于 java.nio.file
包,是 Java 7 引入的文件操作 API 的一部分。
方法定义
public static long size(Path path) throws IOException
方法参数
Path path
- 类型:
java.nio.file.Path
- 描述: 表示要获取大小的文件路径对象
- 注意:
- 必须指向一个实际存在的文件
- 不能是目录(否则会抛出异常)
- 路径可以是绝对路径或相对路径
返回值
long 类型
- 含义: 返回文件的大小,单位是字节
- 特点:
- 如果文件为空,返回 0
- 对于大文件,返回值可能超过
Integer.MAX_VALUE
异常处理
size()
方法可能抛出以下异常:
IOException
- 触发条件:
- 文件不存在
- 没有读取文件的权限
- 输入/输出错误发生
- 路径指向的是目录而非文件
SecurityException
- 触发条件: 当安全管理器存在且拒绝访问文件时
使用示例
基本用法
实例
import java.nio.file.*;
import java.io.IOException;
public class FileSizeExample {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
long fileSize = Files.size(filePath);
System.out.println("File size: " + fileSize + " bytes");
} catch (IOException e) {
System.err.println("Error getting file size: " + e.getMessage());
}
}
}
import java.io.IOException;
public class FileSizeExample {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
long fileSize = Files.size(filePath);
System.out.println("File size: " + fileSize + " bytes");
} catch (IOException e) {
System.err.println("Error getting file size: " + e.getMessage());
}
}
}
处理大文件
实例
// 对于可能很大的文件,考虑使用更友好的显示方式
public static String formatFileSize(long size) {
if (size < 1024) return size + " B";
int exp = (int) (Math.log(size) / Math.log(1024));
char unit = "KMGTPE".charAt(exp-1);
return String.format("%.1f %sB", size / Math.pow(1024, exp), unit);
}
public static String formatFileSize(long size) {
if (size < 1024) return size + " B";
int exp = (int) (Math.log(size) / Math.log(1024));
char unit = "KMGTPE".charAt(exp-1);
return String.format("%.1f %sB", size / Math.pow(1024, exp), unit);
}
注意事项
性能考虑:
- 对于本地文件系统,
size()
操作通常很快 - 对于网络文件系统,可能会有延迟
- 对于本地文件系统,
符号链接:
- 如果路径是符号链接,返回的是链接指向的实际文件大小
文件锁定:
- 方法执行期间不会锁定文件,因此文件大小可能在获取后立即改变
替代方案:
- 对于 Java 旧版本,可以使用
java.io.File.length()
- 对于 Java 旧版本,可以使用
实际应用场景
文件上传前的检查:
实例
// 检查文件是否超过允许的大小
if (Files.size(filePath) > MAX_UPLOAD_SIZE) {
throw new FileTooLargeException();
}
if (Files.size(filePath) > MAX_UPLOAD_SIZE) {
throw new FileTooLargeException();
}
磁盘空间管理:
实例
// 计算目录下所有文件的总大小
long totalSize = Files.walk(dirPath)
.filter(Files::isRegularFile)
.mapToLong(Files::size)
.sum();
long totalSize = Files.walk(dirPath)
.filter(Files::isRegularFile)
.mapToLong(Files::size)
.sum();
进度显示:
实例
// 显示文件复制进度
long totalBytes = Files.size(sourcePath);
long copiedBytes = 0;
// ...在复制循环中更新和显示进度百分比...
long totalBytes = Files.size(sourcePath);
long copiedBytes = 0;
// ...在复制循环中更新和显示进度百分比...
常见问题解答
Q1: size() 方法能用于目录吗?
不能,如果路径指向目录,会抛出 IOException
。要获取目录大小,需要使用 Files.walk()
遍历目录内容并累加文件大小。
Q2: 这个方法会阻塞吗?
对于本地文件系统通常不会明显阻塞,但对于网络文件系统可能会有延迟。
Q3: 为什么返回值是 long 而不是 int?
因为某些文件可能超过 2GB(Integer.MAX_VALUE
),使用 long 可以支持超大文件。
Q4: 这个方法与 File.length() 有什么区别?
Files.size()
是 NIO.2 API 的一部分,支持更多现代文件系统特性(如符号链接),而 File.length()
是传统 I/O 的方法。
总结
java.nio.file.Files.size()
方法提供了一个简单而有效的方式来获取文件大小,是文件操作中常用的工具方法。理解其使用方式和潜在异常对于编写健壮的文件处理代码非常重要。
点我分享笔记