最近遇到一个问题,某网盘上传文件时,文件大小超过了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("文件已完成合并===="); }