有 100 張圖片(如 photo1.jpg、photo2.png...),需要為每張圖片創建一個同名文件夾(去除擴展名),並將圖片移動到對應文件夾中。即:
photo1.jpg → photo1/photo1.jpgphoto2.png → photo2/photo2.png雖然 Shell 或 Python 腳本更簡潔,但 Java 同樣可以高效完成:
import java.io.*;
public class ImageOrganizer {
public static void main(String[] args) {
File sourceDir = new File("/home/user/Pictures");
File[] files = sourceDir.listFiles((dir, name) ->
name.toLowerCase().endsWith(".jpg") ||
name.toLowerCase().endsWith(".png") ||
name.toLowerCase().endsWith(".jpeg")
);
if (files == null) return;
for (File file : files) {
String fileName = file.getName();
// 獲取不含擴展名的文件名
String folderName = fileName.substring(0, fileName.lastIndexOf('.'));
// 創建目標文件夾
File targetDir = new File(sourceDir, folderName);
if (!targetDir.exists()) {
targetDir.mkdirs();
}
// 目標文件路徑
File targetFile = new File(targetDir, fileName);
// 移動文件(同分區可用 renameTo,跨分區需複製+刪除)
if (!file.renameTo(targetFile)) {
// 跨分區時使用複製+刪除
copyFile(file, targetFile);
file.delete();
}
System.out.println("已處理: " + fileName);
}
}
private static void copyFile(File src, File dest) {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest)) {
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
listFiles(FileFilter) 僅處理圖片文件lastIndexOf('.') 獲取擴展名前的文件名mkdirs() 可創建多級目錄,存在時不報錯renameTo()(原子操作,極快),失敗則退回到複製+刪除import os
import shutil
source = "/home/user/Pictures"
for filename in os.listdir(source):
if filename.lower().endswith(('.jpg', '.png', '.jpeg')):
name, _ = os.path.splitext(filename)
target_dir = os.path.join(source, name)
os.makedirs(target_dir, exist_ok=True)
shutil.move(os.path.join(source, filename), os.path.join(target_dir, filename))
Java 版本適合集成到現有 Java 應用中;Python/Shell 適合一次性腳本任務。核心邏輯一致:遍歷 → 解析文件名 → 創建同名目錄 → 移動文件。處理大量文件時建議添加進度顯示與異常重試機制。