文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如:google的GFS、taobao的TFS)里,也是按block为单位,对文件进行分割或合并。
单线程实现:
1 package FileDemo; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.SequenceInputStream; 8 import java.util.ArrayList; 9 import java.util.Collections; 10 import java.util.Enumeration; 11 12 public class MergeFileDemo { 13 14 //定义缓冲区的大小 15 private static final int size = 1024 * 1024; 16 17 /** 18 * @param args 19 * @throws IOException 20 */ 21 public static void main(String[] args) throws IOException { 22 23 File srcFile = new File("D:\destFile"); 24 MergeFileTest(srcFile); 25 } 26 27 private static void MergeFileTest(File srcFile) throws IOException { 28 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); 29 for (int x = 1; x <= 4; x++) { 30 // 将要合并的碎片封装成对象 31 al.add(new FileInputStream(new File(srcFile, x + ".part"))); 32 } 33 Enumeration<FileInputStream> en = Collections.enumeration(al); 34 SequenceInputStream sis = new SequenceInputStream(en); 35 // 将合成的文件封装成一个文件对象 36 FileOutputStream fos = new FileOutputStream(new File(srcFile, "1.mp3")); 37 int len = 0; 38 byte buf[] = new byte[size]; 39 while ((len = sis.read(buf)) != -1) { 40 fos.write(buf, 0, len); 41 } 42 fos.close(); 43 sis.close(); 44 } 45 46 }