【发布时间】:2016-08-09 09:39:08
【问题描述】:
为什么使用 java 和 'du -sk' 为目录计算的已用空间不同?还有 'du -sk' 的确切 java 替代方案是什么?
PFB Java 代码,
final String location = "/home/bhlabhla";
final Path path = Paths.get(location);
final Process process = Runtime.getRuntime().exec("du -sk " + location);
final BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
System.out.println("used space [du -sk]");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("***************************");
// 1
System.out.println("used space [Recursion]:" + getFolderSize(new File(location)) / 1024);
// 2
final long size = Files.walk(path).mapToLong(p -> p.toFile().length()).sum();
System.out.println("used space [Java 8]:" + size / 1024);
public static long getFolderSize(final File dir) {
long size = 0;
for (final File file : dir.listFiles()) {
if (file.isFile()) {
size += file.length();
} else {
size += getFolderSize(file);
}
}
return size;
}
输出,
已用空间 [du -sk]
83164000 /home/bhlabhla
已用空间[递归]:83151664
已用空间 [Java 8]:83153560
【问题讨论】:
-
第一个问题的答案是文件系统开销,有几种不同的方式,最大的通常是集群大小。一个 789 字节的文件并不完全使用 789 字节的存储空间。它使用一些最小存储单元的倍数,通常是 4k 甚至 16k。不过,我不知道问题的答案。
-
感谢您的回复。如果是这样的话,是否有可能通过 java api 获得文件系统开销。
-
没有这样的Java API。
标签: java file-io nio du disk-access