文件拆分成指定大小(IO流)

Posted IFearless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件拆分成指定大小(IO流)相关的知识,希望对你有一定的参考价值。

 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 }

 

以上是关于文件拆分成指定大小(IO流)的主要内容,如果未能解决你的问题,请参考以下文章

如何把一个压缩好的文件,拆分成几个压缩文件?

Socket.io - 套接字拆分成房间 [关闭]

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

如何将实时stdout流拆分成几个文件?

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

记:一次大型单体应用拆分成微服务