移動存儲設備(U 盤、SD 卡、手機內存)長期使用後會積累大量臨時文件、緩存、廢棄安裝包等「垃圾文件」,佔用寶貴空間。本文實現一個 Java 命令行工具,支持遞歸掃描指定目錄,按文件大小篩選並降序排列,幫助用戶快速定位並清理大體積無用文件。
package com.he.jinbin;
import java.util.Date;
/**
* 文件信息封裝類,實現 Comparable 接口支持自定義排序
*/
public class FileItem implements Comparable<FileItem> {
private String fileName; // 完整路徑
private long size; // 文件大小(字節)
private Date createTime; // 最後修改時間
public FileItem(String fileName, long size, Date createTime) {
this.fileName = fileName;
this.size = size;
this.createTime = createTime;
}
// Getter/Setter 方法省略...
@Override
public int compareTo(FileItem other) {
// 降序:大文件在前
return Long.compare(other.size, this.size);
}
}
package com.he.jinbin;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* 掃描排序主類
*/
public class Sort {
private static final long MB = 1024L * 1024L; // 1MB 字節數
private static List<FileItem> fileItems = new ArrayList<>();
private static long sizeThreshold = MB; // 默認 1MB
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// 1. 獲取掃描路徑
System.out.print("請輸入掃描目錄路徑(如 H:\\):");
String scanPath = reader.readLine().trim();
// 2. 獲取大小閾值
System.out.print("請輸入最小文件大小(單位 MB,如 10):");
String input = reader.readLine().trim();
sizeThreshold = Long.parseLong(input) * MB;
reader.close();
System.out.println("正在掃描,請稍候...");
File root = new File(scanPath);
if (!root.exists() || !root.isDirectory()) {
System.err.println("路徑無效或不是目錄!");
return;
}
// 3. 遞歸掃描
scanFiles(root);
// 4. 排序並輸出
Collections.sort(fileItems);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
System.out.println("\n掃描完成,共發現 " + fileItems.size() + " 個符合條件的文件(按大小降序):");
System.out.println("----------------------------------------------------------------");
for (FileItem item : fileItems) {
System.out.printf("%s\t%d KB\t%s%n",
item.getFileName(),
item.getSize() / 1024,
sdf.format(item.getCreateTime()));
}
}
/**
* 遞歸掃描文件
*/
private static void scanFiles(File dir) {
File[] files = dir.listFiles();
if (files == null) return; // 權限不足或非目錄
for (File file : files) {
if (file.isDirectory()) {
scanFiles(file); // 遞歸進入子目錄
} else if (file.length() >= sizeThreshold) {
// 滿足大小條件,記錄文件信息
fileItems.add(new FileItem(
file.getAbsolutePath(),
file.length(),
new Date(file.lastModified())
));
}
}
}
}
D:\project\SortSize\bin>java com.he.jinbin.Sort
請輸入掃描目錄路徑(如 H:\):H:\
請輸入最小文件大小(單位 MB,如 10):10
正在掃描,請稍候...
掃描完成,共發現 6 個符合條件的文件(按大小降序):
----------------------------------------------------------------
H:\.android_secure\com.sg.android.fish-1.asec 3622400 KB 20130525
H:\BaiduMap\vmp\h\quanguogailue.dat 2761601 KB 20130512
H:\Download\RedGame_Android_2017-11-06.apk 2656309 KB 20131111
H:\ugame\ugameSDK\downloads\6F9757F4442DD99FC89FA387C80405D2.apk 2630596 KB 20131025
H:\Download\com.tencent.mobileqq_60.apk 2541788 KB 20130714
H:\Android\data\com.android.gallery3d\cache\imgcache.0 2207078 KB 20140210
Files.walkFileTree (NIO.2) 替代傳統 File.listFiles(),支持更好的異常處理與並行遍歷SecurityException 優雅跳過無權限目錄SortSize/
├── src/
│ └── com/he/jinbin/
│ ├── FileItem.java
│ └── Sort.java
└── bin/ (編譯輸出目錄)
# 編譯
javac -d bin src/com/he/jinbin/*.java
# 運行
java -cp bin com.he.jinbin.Sort
本工具通過簡潔的遞歸遍歷與集合排序,實用解決了存儲設備大文件排查難題。代碼結構清晰,擴展性強,適合作為文件系統操作的入門實戰項目。實際部署時可封裝為可執行 JAR 或配合腳本實現定時自動化清理。