现在大部分磁盘瘦身工具都是收费的,帮你扫描完,你要去瘦身,就需要加会员,于是不如自己写个磁盘清理工具,安全起见这里只提供最简单的,需要扩展功能,自己按照这个思路去摸索,或者直接用AI写
java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* C盘瘦身工具类(增强版)
* 安全清理:安装包残留、系统缓存残留,不影响系统运行
*/
public class CSlimmingEnhancedTool {
// ========== 安全配置项(核心,请勿随意修改) ==========
// 1. 安装包残留文件类型(仅清理这些格式)
private static final Set<String> INSTALL_PACK_EXT = new HashSet<>(Arrays.asList(
"exe", "msi", "zip", "rar", "7z", "gz", "tar", "iso", "pkg", "dmg", "bin"
));
// 2. 系统缓存残留文件类型
private static final Set<String> CACHE_EXT = new HashSet<>(Arrays.asList(
"cache", "tmp", "temp", "log", "bak", "old", "dat", "ini", "sqlite", "db"
));
// 3. 安全扫描目录(仅扫描这些目录,避开System32/Program Files等核心目录)
private static final List<String> SAFE_SCAN_DIRS = new ArrayList<>(Arrays.asList(
// 安装包常见目录
System.getProperty("user.home") + "\\Downloads", // 下载文件夹
System.getProperty("user.home") + "\\Desktop", // 桌面
"C:\\Downloads", // 公共下载目录
// 缓存常见目录
System.getenv("TEMP"), // 用户临时目录
"C:\\Windows\\Temp", // 系统临时目录
System.getProperty("user.home") + "\\AppData\\Local\\Temp",// 用户缓存
System.getProperty("user.home") + "\\AppData\\Roaming\\Microsoft\\Windows\\Caches" // 系统缓存
));
// 4. 黑名单目录(绝对禁止扫描/删除)
private static final Set<String> BLACKLIST_DIRS = new HashSet<>(Arrays.asList(
"C:\\Windows\\System32",
"C:\\Windows\\SysWOW64",
"C:\\Program Files",
"C:\\Program Files (x86)",
"C:\\Windows\\System",
"C:\\Windows\\Boot"
));
// ========== 日志配置 ==========
private static final String LOG_FILE = System.getProperty("user.home") + "\\CSlimmingTool_Enhanced.log";
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 分类扫描可清理文件
* @return Map<类型, 文件列表>:key为"INSTALL_PACK"(安装包)/"CACHE"(缓存)
*/
public Map<String, List<File>> scanCleanableFiles() {
Map<String, List<File>> result = new HashMap<>();
result.put("INSTALL_PACK", new ArrayList<>());
result.put("CACHE", new ArrayList<>());
log("开始扫描C盘可清理文件...");
for (String dirPath : SAFE_SCAN_DIRS) {
File dir = new File(dirPath);
if (!dir.exists() || !dir.isDirectory()) {
log("目录不存在或非文件夹,跳过:" + dirPath);
continue;
}
// 递归扫描目录,分类收集文件
scanDir(dir, result);
}
log("扫描完成 | 安装包残留:" + result.get("INSTALL_PACK").size() + "个 | 缓存残留:" + result.get("CACHE").size() + "个");
return result;
}
/**
* 递归扫描目录,分类收集可清理文件
*/
private void scanDir(File dir, Map<String, List<File>> result) {
// 跳过黑名单目录
if (isBlacklistDir(dir)) {
log("命中黑名单,跳过目录:" + dir.getAbsolutePath());
return;
}
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
// 递归处理子目录
if (file.isDirectory()) {
scanDir(file, result);
continue;
}
// 校验文件:非系统保护、非空、可读写
if (!isSafeFile(file)) {
continue;
}
// 分类添加到对应列表
String ext = getFileExtension(file).toLowerCase();
if (INSTALL_PACK_EXT.contains(ext)) {
result.get("INSTALL_PACK").add(file);
} else if (CACHE_EXT.contains(ext)) {
result.get("CACHE").add(file);
}
}
}
/**
* 校验文件是否为安全可清理文件
*/
private boolean isSafeFile(File file) {
try {
// 1. 跳过空文件(无清理意义)
if (file.length() == 0) return false;
// 2. 跳过系统保护文件(不可读/不可写)
if (!file.canRead() || !file.canWrite()) return false;
// 3. 跳过最近24小时修改的文件(避免误删刚下载/使用的文件)
BasicFileAttributes attrs = Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class);
long lastModified = attrs.lastModifiedTime().toMillis();
long now = System.currentTimeMillis();
if (now - lastModified < 24 * 60 * 60 * 1000) {
return false;
}
return true;
} catch (Exception e) {
log("文件校验失败:" + file.getAbsolutePath() + " | 原因:" + e.getMessage());
return false;
}
}
/**
* 判断目录是否在黑名单中
*/
private boolean isBlacklistDir(File dir) {
String absPath = dir.getAbsolutePath().toLowerCase();
for (String blackDir : BLACKLIST_DIRS) {
if (absPath.startsWith(blackDir.toLowerCase())) {
return true;
}
}
return false;
}
/**
* 获取文件扩展名(不含点)
*/
private String getFileExtension(File file) {
String fileName = file.getName();
int lastDotIndex = fileName.lastIndexOf(".");
if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
return "";
}
return fileName.substring(lastDotIndex + 1);
}
/**
* 执行文件清理(用户确认后调用)
* @param files 待清理文件列表
* @return 清理成功的文件数量
*/
public int cleanFiles(List<File> files) {
int successCount = 0;
log("开始清理文件 | 待清理数量:" + files.size());
for (File file : files) {
try {
// 清理前再次校验(双重防护)
if (!isSafeFile(file) || isBlacklistDir(file.getParentFile())) {
log("跳过非安全文件:" + file.getAbsolutePath());
continue;
}
// 安全删除文件(使用Files.delete更稳定)
Path path = Paths.get(file.getAbsolutePath());
Files.deleteIfExists(path);
if (!file.exists()) { // 验证是否删除成功
successCount++;
log("清理成功:" + file.getAbsolutePath() + " | 大小:" + formatFileSize(file.length()));
} else {
log("清理失败:文件仍存在 | " + file.getAbsolutePath());
}
} catch (Exception e) {
log("清理异常:" + file.getAbsolutePath() + " | 原因:" + e.getMessage());
}
}
log("清理完成 | 成功删除:" + successCount + "个 | 失败:" + (files.size() - successCount) + "个");
return successCount;
}
/**
* 格式化文件大小(字节转易读格式)
*/
public String formatFileSize(long size) {
if (size < 1024) return size + " B";
else if (size < 1024 * 1024) return String.format("%.2f KB", size / 1024.0);
else if (size < 1024 * 1024 * 1024) return String.format("%.2f MB", size / (1024.0 * 1024));
else return String.format("%.2f GB", size / (1024.0 * 1024 * 1024));
}
/**
* 计算文件列表总大小
*/
public String calculateTotalSize(List<File> files) {
long total = 0;
for (File file : files) {
total += file.length();
}
return formatFileSize(total);
}
/**
* 记录操作日志
*/
private void log(String content) {
try (FileWriter writer = new FileWriter(LOG_FILE, true)) {
String logContent = DATE_FORMAT.format(new Date()) + " - " + content + "\n";
writer.write(logContent);
} catch (IOException e) {
System.err.println("日志写入失败:" + e.getMessage());
}
}
// ========== 测试主方法(演示使用流程) ==========
public static void main(String[] args) {
CSlimmingEnhancedTool tool = new CSlimmingEnhancedTool();
// 1. 扫描可清理文件
Map<String, List<File>> cleanableFiles = tool.scanCleanableFiles();
List<File> installPackFiles = cleanableFiles.get("INSTALL_PACK");
List<File> cacheFiles = cleanableFiles.get("CACHE");
// 2. 展示扫描结果
System.out.println("===== 扫描结果 =====");
System.out.println("安装包残留:" + installPackFiles.size() + "个 | 总大小:" + tool.calculateTotalSize(installPackFiles));
System.out.println("缓存残留:" + cacheFiles.size() + "个 | 总大小:" + tool.calculateTotalSize(cacheFiles));
// 3. 预览前5个安装包和前5个缓存文件
System.out.println("\n===== 安装包残留预览(前5个) =====");
for (int i = 0; i < Math.min(5, installPackFiles.size()); i++) {
File file = installPackFiles.get(i);
System.out.println((i+1) + ". " + file.getAbsolutePath() + " | 大小:" + tool.formatFileSize(file.length()));
}
System.out.println("\n===== 缓存残留预览(前5个) =====");
for (int i = 0; i < Math.min(5, cacheFiles.size()); i++) {
File file = cacheFiles.get(i);
System.out.println((i+1) + ". " + file.getAbsolutePath() + " | 大小:" + tool.formatFileSize(file.length()));
}
// 4. 用户确认后清理
Scanner scanner = new Scanner(System.in);
System.out.print("\n是否确认清理以上文件?(Y/N):");
String confirm = scanner.next();
if ("Y".equalsIgnoreCase(confirm)) {
// 合并所有可清理文件
List<File> allFiles = new ArrayList<>();
allFiles.addAll(installPackFiles);
allFiles.addAll(cacheFiles);
int success = tool.cleanFiles(allFiles);
System.out.println("清理完成 | 成功删除:" + success + "个文件");
} else {
System.out.println("取消清理操作");
}
scanner.close();
}
}
工具功能说明
-
安全清理原则:
- 只清理指定的安全目录,如临时文件夹、浏览器缓存等
- 排除系统关键文件(.sys、.dll、.exe等)
- 检查文件是否被锁定,避免删除正在使用的文件
- 提供预览功能,让用户确认后再执行清理
-
清理范围:
- Windows临时目录(%TEMP%)
- 用户临时目录(AppData\Local\Temp)
- 浏览器缓存(Chrome、Firefox)
- 系统临时目录(Windows\Temp、Windows\Prefetch)
-
使用方法:
- 运行程序后,会自动扫描可清理的文件
- 显示扫描结果,包括文件数量和可释放空间
- 用户确认后执行清理操作
- 清理完成后显示成功删除的文件数和实际释放的空间
-
安全性保障:
- 只在预定义的安全目录中进行清理
- 排除系统关键文件和正在使用的文件
- 提供详细的清理日志,方便追踪操作
- 采用保守策略,只删除确定安全的文件
扩展建议
- 添加GUI界面:可以使用Swing或JavaFX创建图形界面,提高用户体验
- 增加清理选项:允许用户选择要清理的目录和文件类型
- 添加备份功能:在删除文件前自动备份到指定位置
- 定期清理:添加定时任务功能,定期自动执行清理
- 跨平台支持:扩展支持Linux和MacOS系统
这个工具以安全为首要原则,通过严格的文件筛选机制,确保只删除无风险的临时文件和缓存,不会影响系统的正常运行。
