package com.xxxx.filemanager; import java.io.File; import java.text.Collator; import java.util.Arrays; import java.util.Comparator; /** * 文件排序工具类 * @author zhanggeng * */ public class FileSorter implements Comparator<File> { private static Comparator<Object> cmp = Collator .getInstance(java.util.Locale.CHINA); public static final int TYPE_DEFAULT = -1; //按照修改日期降序排列 public static final int TYPE_MODIFIED_DATE_DOWN = 1; //按照修改日期升序排列 public static final int TYPE_MODIFIED_DATE_UP = 2; //按照文件大小降序排列 public static final int TYPE_SIZE_DOWN = 3; //按照文件大小升序排列 public static final int TYPE_SIZE_UP = 4; //按照名字升序排序 public static final int TYPE_NAME_UP = 5; //按照名字降序排列 public static final int TYPE_NAME_DOWN = 6; //按照扩展名升序排列 public static final int TYPE_SUFFIX_UP = 7; //按照扩展名降序排列 public static final int TYPE_SUFFIX_DOWN = 8; // public static final int TYPE_DIR = 9; private int mType = 5; public FileSorter(int type) { if (type < 0 || type > 9) { type = TYPE_DIR; } mType = type; } @Override public int compare(File object1, File object2) { int result = 0; switch (mType) { case TYPE_MODIFIED_DATE_DOWN:// last modified date down result = compareByModifiedDateDown(object1, object2); break; case TYPE_MODIFIED_DATE_UP:// last modified date up result = compareByModifiedDateUp(object1, object2); break; case TYPE_SIZE_DOWN: // file size down result = compareBySizeDown(object1, object2); break; case TYPE_SIZE_UP: // file size up result = compareBySizeUp(object1, object2); break; case TYPE_NAME_UP: // name result = compareByNameUp(object1, object2); break; case TYPE_NAME_DOWN: // name result = compareByNameDown(object1, object2); break; case TYPE_DIR: // dir or file result = compareByDir(object1, object2); break; case TYPE_SUFFIX_DOWN: result = compareBySuffixDown(object1, object2); break; case TYPE_SUFFIX_UP: result = compareBySuffixUp(object1, object2); break; default: result = compareByDir(object1, object2); break; } return result; } private int compareByModifiedDateDown(File object1, File object2) { return compareDate(object1, object2, -1); } private int compareByModifiedDateUp(File object1, File object2) { return compareDate(object1, object2, 1); } private int compareDate(File object1, File object2, int flag) { if (object1.isDirectory() && object2.isDirectory()) { return compareModifiedDate(object1, object2, flag); } if (object1.isDirectory() && object2.isFile()) { return -1; } if (object1.isFile() && object2.isDirectory()) { return 1; } return compareModifiedDate(object1, object2, flag); } private int compareModifiedDate(File object1, File object2, int downOrup) { long d1 = object1.lastModified(); long d2 = object2.lastModified(); if (d1 == d2) { return 0; } else { return downOrup < 0 ? (d1 < d2 ? 1 : -1) : (d1 > d2 ? 1 : -1); } } private int compareBySizeDown(File object1, File object2) { if (object1.isDirectory() && object2.isDirectory()) { return calculateFolderSize(object1, object2, -1); } if (object1.isDirectory() && object2.isFile()) { return -1; } if (object1.isFile() && object2.isDirectory()) { return 1; } long s1 = object1.length(); long s2 = object2.length(); if (s1 == s2) { return 0; } else { return s1 < s2 ? 1 : -1; } } private int compareBySizeUp(File object1, File object2) { if (object1.isDirectory() && object2.isDirectory()) { return calculateFolderSize(object1, object2, 1); } if (object1.isDirectory() && object2.isFile()) { return -1; } if (object1.isFile() && object2.isDirectory()) { return 1; } long s1 = object1.length(); long s2 = object2.length(); if (s1 == s2) { return 0; } else { return s1 > s2 ? 1 : -1; } } private int calculateFolderSize(File object1, File object2, int upOrDown) { long s1 = FileUtils.getFileSize(object1); long s2 = FileUtils.getFileSize(object2); if (s1 == s2) { return upOrDown > 0 ? compareByName(object1, object2) : -compareByName(object1, object2); } else { return upOrDown > 0 ? (s1 > s2 ? 1 : -1) : (s1 < s2 ? 1 : -1); } } private int compareByNameDown(File object1, File object2) { if (object1.isDirectory() && object2.isFile()) { return -1; } else if (object1.isDirectory() && object2.isDirectory()) { return -compareByName(object1, object2); } else if (object1.isFile() && object2.isDirectory()) { return 1; } else { // object1.isFile() && object2.isFile()) return -compareByName(object1, object2); } } private int compareByNameUp(File object1, File object2) { if (object1.isDirectory() && object2.isFile()) { return -1; } else if (object1.isDirectory() && object2.isDirectory()) { return compareByName(object1, object2); } else if (object1.isFile() && object2.isDirectory()) { return 1; } else { // object1.isFile() && object2.isFile()) return compareByName(object1, object2); } } private int compareByName(File object1, File object2) { Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA); return cmp.compare(object1.getName(), object2.getName()); } private int compareByDir(File object1, File object2) { if (object1.isDirectory() && object2.isFile()) { return -1; } else if (object1.isDirectory() && object2.isDirectory()) { return compareByName(object1, object2); } else if (object1.isFile() && object2.isDirectory()) { return 1; } else { // object1.isFile() && object2.isFile()) return compareByName(object1, object2); } } private int compareBySuffixUp(File f1, File f2) { return compareSuffix(f1, f2, 1); } private int compareBySuffixDown(File f1, File f2) { return compareSuffix(f1, f2, -1); } private int compareSuffix(File f1, File f2, int upOrdown) { if (f1.isDirectory() && f2.isDirectory()) { return cmp.compare(f1.getName(), f2.getName()); } if (f1.isDirectory() && f2.isFile()) { return -1; } if (f1.isFile() && f2.isDirectory()) { return 1; } String filename1 = f1.getName(); String filename2 = f2.getName(); int s1 = filename1.lastIndexOf("."); int s2 = filename2.lastIndexOf("."); if (s1 < 0 || s2 < 0) { return upOrdown > 0 ? cmp.compare(filename1, filename2) : -cmp .compare(filename1, filename2); } else { String suffix1 = filename1.substring(s1).trim(); String suffix2 = filename2.substring(s2).trim(); return upOrdown > 0 ? cmp.compare(suffix1, suffix2) : -cmp.compare( suffix1, suffix2); } } }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10358.html