文件排序Java工具类详解编程语言

    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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论