public class {
public void mergePartFiles(String dirpath, String partFileSuffix, String mergeFileName) throws Exception {
ArrayList<File> partFiles = getDirFiles(dirpath, partFileSuffix);
Collections.sort(partFiles, new FileComparator());
int partFileSize = (int) partFiles.get(0).length();
RandomAccessFile randomAccessFile = new RandomAccessFile(mergeFileName, "rw");
randomAccessFile.setLength(partFileSize * (partFiles.size() - 1) + partFiles.get(partFiles.size() - 1).length());
randomAccessFile.close();
for (File partFile : partFiles) {
System.out.println(partFile.getName() + partFile.length());
}
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(partFiles.size(), partFiles.size() * 3, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(partFiles.size() * 2));
for (int i = 0; i < partFiles.size(); i++) {
threadPool.execute(new MergeRunnable(i * partFileSize, mergeFileName, partFiles.get(i)));
}
System.out.println("成功了!!!");
}
private ArrayList<File> getDirFiles(String dirpath, final String suffix) {
File path = new File(dirpath);
File[] fileArr = path.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
String lowerName = name.toLowerCase();
String filesuffix = suffix.toLowerCase();
if (lowerName.endsWith(filesuffix)) {
return true;
} else
return false;
}
});
ArrayList<File> files = new ArrayList<File>();
for (File file : fileArr) {
if (file.isFile()) {
files.add(file);
}
}
return files;
}
public List<String> splitBySize(String fileName, int count) throws Exception {
List<String> parts = new ArrayList<String>();
File file = new File(fileName);
List<Integer> bytes = new ArrayList<Integer>();
int countLen = (count+"").length();
testLen((int) file.length(), count, bytes);
ThreadPoolExecutor threadpool = new ThreadPoolExecutor(count, count * 3, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(count * 2));
for (int i = 0; i < count; i++) {
String partFileName = file.getName() + "_" + leftPad(i+"",countLen,'0') + ".part";
threadpool.execute(new SplitRunnable(bytes.get(i), i * bytes.get(i == 0 ? 0 : i - 1), partFileName, file));
parts.add(partFileName);
}
return parts;
}
private String leftPad(String str, int countLen, char c) {
if (str.length() > countLen) {
return str;
}
char[] chs = new char[countLen];
Arrays.fill(chs, c);
char[] src = str.toCharArray();
System.arraycopy(src, 0, chs, countLen - src.length, src.length);
return new String(chs);
}
public static void main(String[] args) throws Exception {
new FileUtils().mergePartFiles("D:\test\frj\", ".mp4", "D:\test\frj\merge.mp4");
}
public static void testLen(Integer len, int count, List<Integer> arr) {
int i = len / count;
int j = 0;
if (len % count == 0) {
while (j < count) {
arr.add(i);
j++;
}
} else {
int sum = 0;
while (j < count - 1) {
sum += i;
arr.add(i);
j++;
}
arr.add(len - sum);
}
System.out.println(arr);
}
private class FileComparator implements Comparator<File> {
public int compare(File o1, File o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}
近期评论