1 package stream;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.util.Arrays;
8
9 public class TestStream {
10
11 public static void main(String[] args) {
12 int eachSize = 100 * 1024; // 100k
13 File srcFile = new File("d:/eclipse.exe");
14 splitFile(srcFile, eachSize);
15 }
16
17 /**
18 * 拆分的思路,先把源文件的所有内容读取到内存中,然后从内存中挨个分到子文件里
19 * @param srcFile 要拆分的源文件
20 * @param eachSize 按照这个大小,拆分
21 */
22 private static void splitFile(File srcFile, int eachSize) {
23
24 if (0 == srcFile.length())
25 throw new RuntimeException("文件长度为0,不可拆分");
26
27 byte[] fileContent = new byte[(int) srcFile.length()];
28 // 先把文件读取到数组中
29 try {
30 FileInputStream fis = new FileInputStream(srcFile);
31 fis.read(fileContent);
32 fis.close();
33 } catch (IOException e) {
34 // TODO Auto-generated catch block
35 e.printStackTrace();
36 }
37 // 计算需要被划分成多少份子文件
38 int fileNumber;
39 // 文件是否能被整除得到的子文件个数是不一样的
40 // (假设文件长度是25,每份的大小是5,那么就应该是5个)
41 // (假设文件长度是26,每份的大小是5,那么就应该是6个)
42 if (0 == fileContent.length % eachSize)
43 fileNumber = (int) (fileContent.length / eachSize);
44 else
45 fileNumber = (int) (fileContent.length / eachSize) + 1;
46
47 for (int i = 0; i < fileNumber; i++) {
48 String eachFileName = srcFile.getName() + "-" + i;
49 File eachFile = new File(srcFile.getParent(), eachFileName);
50 byte[] eachContent;
51
52 // 从源文件的内容里,复制部分数据到子文件
53 // 除开最后一个文件,其他文件大小都是100k
54 // 最后一个文件的大小是剩余的
55 if (i != fileNumber - 1) // 不是最后一个
56 eachContent = Arrays.copyOfRange(fileContent, eachSize * i, eachSize * (i + 1));
57 else // 最后一个
58 eachContent = Arrays.copyOfRange(fileContent, eachSize * i, fileContent.length);
59
60 try {
61 // 写出去
62 FileOutputStream fos = new FileOutputStream(eachFile);
63 fos.write(eachContent);
64 // 记得关闭
65 fos.close();
66 System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length());
67 } catch (IOException e) {
68 // TODO Auto-generated catch block
69 e.printStackTrace();
70 }
71 }
72 }
73 }