最近遇到一个问题,某网盘上传文件时,文件大小超过了4个G ,不能上传,所以就想到了利用的java的IO流,将文件分割成多个小文件,上传到网盘上,等到需要用的时候,下载下来然后再进行文件的合并就可以了。

这里以分割一个8.85M的PDF文件为例,分割成每个大小为1M的文件,分割文件的大小,只需修改size即可,代码如下:

 

1.文件的分割

public static void main(String[] args) throws IOException {
        
            //要分割出来的文件的大小
            int size = 1024*1024*1;//1M
            
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File("D:\\zzy\\aaaa\\fileSplit\\java.pdf")));
            int len = -1;
            for (int i = 0; i < 9; i++) { //8.85M的文件分割成8个1M的,和一个0.85M的
                File file = new File("D:\\zzy\\aaaa\\fileSplit\\" + i + "temp.temp");//分割的文件格式可以随便设置,只要文件合并时名称一致即可
                FileOutputStream outputStream = new FileOutputStream(file);
                BufferedOutputStream out = new BufferedOutputStream(outputStream);
            
                int count = 0;
                byte[] bt = new byte[1024 * 1024];//每次读取1M,数组大小不能太大,会内存溢出,通过目标文件大小size判断一下
                while ((len = in.read(bt)) != -1) {
                
                    out.write(bt, 0, len);
                    count += len;
                    if(count>=size) {
                        break;//每次读取1M,然后写入到文件中
                    }
                }
            
                out.flush();
                out.close();
                outputStream.close();
            
                System.out.println("文件已完成:" + file.getName());
            }
    
            System.out.println("文件已完成分割====");
        }

  

 

2.文件的合并

public static void main(String[] args) throws IOException {
            
        //文件合并

            BufferedOutputStream out = new BufferedOutputStream(
                    new FileOutputStream(new File("D:\\zzy\\aaaa\\fileSplit\\java(merge).pdf")));
            
            for (int i = 0; i < 9; i++) { //9个文件合并成8.85M的文件
                File file = new File("D:\\zzy\\aaaa\\fileSplit\\" + i + "temp.temp");
                FileInputStream inputStream = new FileInputStream(file);
                BufferedInputStream in = new BufferedInputStream(inputStream);
                
                int len = -1;
                byte[] bt = new byte[1024 * 1024];//每次读取1M,数组大小不能太大,会内存溢出
                while ((len = in.read(bt)) != -1) {
                
                    out.write(bt, 0, len);
                }
            
                in.close();
                inputStream.close();
                out.flush();
            
                System.out.println("文件已完成:" + file.getName());
            }
        
            System.out.println("文件已完成合并====");
        }