首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 掃描並依大小排序檔案:清理 USB/記憶卡垃圾檔案實用工具

     編輯:Java 相關知識

前言

隨著手機、相機、行動硬碟儲存空間日益緊張,快速找出佔用空間最大的檔案成為常見需求。本文提供一個純 Java 的命令列工具,遞迴掃描指定目錄,依檔案大小降冪排序並顯示路徑、大小(KB)與建立日期,協助使用者快速鎖定可刪除的大檔案。

程式運作流程

  1. 輸入掃描根目錄(例:H:\)。
  2. 輸入檔案大小門檻(單位 MB,例:10 表示只列出 ≥10MB 的檔案)。
  3. 遞迴遍歷所有子目錄,收集符合條件的檔案資訊封裝為 FileItem。
  4. 使用 Collections.sort() 依大小排序(實作 Comparable)。
  5. 由大到小輸出:完整路徑-------大小 KB--------建立日期(yyyyMMdd)。

核心類別:FileItem

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);
    }
}

主程式:Sort

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

改進建議

  • 單位轉換:輸出時將 bytes 轉為 MB/GB,提升可讀性。
  • 多執行緒掃描:使用 ForkJoinPool 或 ExecutorService 平行處理子目錄,大幅縮短掃描時間。
  • 圖形介面:搭配 Swing/JavaFX 呈現樹狀結構與餅圖,支援右鍵直接刪除。
  • 過濾條件擴充:依副檔名、修改時間、隱藏屬性等多維度過濾。
  • 安全刪除:整合 Files.deleteIfExists() 並記錄刪除日誌,支援復原機制。

注意事項

  1. 掃描系統盤(C:)需管理員權限,否則會因存取拒絕拋出例外。
  2. 網路磁碟機(UNC 路徑)同樣適用,但速度受限於頻寬。
  3. 大量檔案時 ArrayList 可能佔用大量記憶體,可改用資料庫暫存或分頁處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved