隨著手機、相機、行動硬碟儲存空間日益緊張,快速找出佔用空間最大的檔案成為常見需求。本文提供一個純 Java 的命令列工具,遞迴掃描指定目錄,依檔案大小降冪排序並顯示路徑、大小(KB)與建立日期,協助使用者快速鎖定可刪除的大檔案。
H:\)。10 表示只列出 ≥10MB 的檔案)。FileItem。Collections.sort() 依大小排序(實作 Comparable)。完整路徑-------大小 KB--------建立日期(yyyyMMdd)。package com.he.jinbin;
import java.util.Date;
public class FileItem implements Comparable<FileItem> {
private String fileName;
private long size;
private Date creatTime;
public FileItem(String fileName, long size, Date creaDate) {
this.fileName = fileName;
this.size = size;
this.creatTime = creaDate;
}
// Getter/Setter 省略...
@Override
public int compareTo(FileItem o) {
// 由大到小:this.size > o.size 回傳 1
return Long.compare(this.size, o.size);
}
}
package com.he.jinbin;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class Sort {
public static List<FileItem> fileItems = new ArrayList<>();
public static final long MB = 1024L * 1024L;
public static long threshold = MB; // 預設 1MB
public static void addFileItem(File file) {
File[] list = file.listFiles();
if (list == null) return; // 無權限或非目錄
for (File f : list) {
if (f.isDirectory()) {
addFileItem(f);
} else if (f.length() > threshold) {
fileItems.add(new FileItem(f.getPath(), f.length(), new Date(f.lastModified())));
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("請輸入掃描目錄路徑: ");
String path = br.readLine();
System.out.print("請輸入檔案大小門檻 (MB): ");
threshold = Long.parseLong(br.readLine()) * MB;
br.close();
System.out.println("掃描中,請稍候...");
addFileItem(new File(path));
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
Collections.sort(fileItems); // 依 compareTo 由小到大
System.out.println("由大到小排序結果:");
for (int i = fileItems.size() - 1; i >= 0; i--) {
FileItem item = fileItems.get(i);
System.out.printf("%s-------%d KB--------%s%n",
item.getFileName(), item.getSize() / 1024, fmt.format(item.getCreatTime()));
}
}
}
D:\work\SortSize\bin> java com.he.jinbin.Sort
請輸入掃描目錄路徑: H:\
請輸入檔案大小門檻 (MB): 10
掃描中,請稍候...
由大到小排序結果:
H:\.android_secure\com.sg.android.fish-1.asec-------36224000 KB--------20130525
H:\BaiduMap\vmp\h\quanguogailue.dat-------27616013 KB--------20130512
H:\Download\RedGame_Android_2017-2013-11-06_18-54-27-CI-20.apk-------26563096 KB--------20131111
H:\ugame\ugameSDK\downloads\6F9757F4442DD99FC89FA387C80405D2.apk-------26305964 KB--------20131025
H:\Download\com.tencent.mobileqq_60.apk-------25417880 KB--------20130714
H:\Android\data\com.android.gallery3d\cache\imgcache.0-------22070789 KB--------20140210
ForkJoinPool 或 ExecutorService 平行處理子目錄,大幅縮短掃描時間。Files.deleteIfExists() 並記錄刪除日誌,支援復原機制。ArrayList 可能佔用大量記憶體,可改用資料庫暫存或分頁處理。