package com.quick.core.util.io; import java.io.File; import java.text.Collator; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Created by dailichun on 2017/12/7. * 文件排序 */ public class FileSorter implements Comparator<File> { /** * 默认排序方式,按目录,文件排序 * TYPE_DIR */ 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 = 5; /** * 按目录,文件排序 */ public static final int TYPE_DIR = 7; private int mType = -1; public FileSorter(int type) { if (type < 0 || type > 7) { type = TYPE_DIR; } mType = type; } @Override public int compare(File object1, File object2) { int result = 0; switch (mType) { case TYPE_MODIFIED_DATE_DOWN: result = compareByModifiedDateDown(object1, object2); break; case TYPE_MODIFIED_DATE_UP: result = compareByModifiedDateUp(object1, object2); break; case TYPE_SIZE_DOWN: result = compareBySizeDown(object1, object2); break; case TYPE_SIZE_UP: result = compareBySizeUp(object1, object2); break; case TYPE_NAME: result = compareByName(object1, object2); case TYPE_DIR: result = compareByDir(object1, object2); break; default: result = compareByDir(object1, object2); break; } return result; } /** * @param object1 * @param object2 * @return */ 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 { return compare(object1, object2); } } /** * @param object1 * @param object2 * @return */ private int compareByName(File object1, File object2) { Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA); return cmp.compare(object1.getName(), object2.getName()); } /** * @param object1 * @param object2 * @return */ private int compareBySizeUp(File object1, File object2) { if (object1.isDirectory() && object2.isDirectory()) { return 0; } 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; } } /** * @param object1 * @param object2 * @return */ private int compareBySizeDown(File object1, File object2) { if (object1.isDirectory() && object2.isDirectory()) { return 0; } 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 compareByModifiedDateUp(File object1, File object2) { long d1 = object1.lastModified(); long d2 = object2.lastModified(); if (d1 == d2) { return 0; } else { return d1 > d2 ? 1 : -1; } } private int compareByModifiedDateDown(File object1, File object2) { long d1 = object1.lastModified(); long d2 = object2.lastModified(); if (d1 == d2) { return 0; } else { return d1 < d2 ? 1 : -1; } } /** * 按名称排序 * * @param path * @return */ public static List<File> sortByName(String path) { System.out.println(path); List<File> files = Arrays.asList(new File(path).listFiles()); Collections.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { if (o1.isDirectory() && o2.isFile()) return -1; if (o1.isFile() && o2.isDirectory()) return 1; return o1.getName().compareTo(o2.getName()); } }); return files; } }