文件分割與合併是一個常見需求,比如:上傳大文件時,可以先分割成小塊,傳到服務器後,再進行合併。很多高大上的分佈式文件系統(比如:google的GFS、taobao的TFS)裡,也是按block為單位,對文件進行分割或合併。
看下基本思路:
如果有一個大文件,指定分割大小後(比如:按1M切割)
step 1:
先根據原始文件大小、分割大小,算出最終分割的小文件數N
step 2:
在磁盤上創建這N個小文件
step 3:
開多個線程(線程數=分割文件數),每個線程裡,利用RandomAccessFile的seek功能,將讀取指針定位到原文件裡每一段的段首位置,然後向後讀取指定大小(即:分割塊大小),最終寫入對應的分割文件,因為多線程並行處理,各寫各的小文件,速度相對還是比較快的。
下面代碼是將一個文件拆分為多個子文件,每個大小是100K
package testIO;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Arrays;public class subStream {public static void main(String[] args) {//先將源文件讀取到內存中int eachSize=100*1024;File srcFile =new File("F:/test/test.txt");//創建一個文件對象splitFile(srcFile,eachSize);}public static void splitFile(File srcFile,int eachSize){//判斷文件是否符合拆分要求if(srcFile.length()==0){throw new RuntimeException("文件不符合拆分要求");}byte[] fileContent= new byte[(int) srcFile.length()];try {//將文件內容讀取到內存中FileInputStream fis=new FileInputStream(srcFile);fis.read(fileContent);fis.close();}catch (Exception e) {e.printStackTrace();}//計算要次要拆分為多少份int fileNumber;if(fileContent.length%eachSize==0){fileNumber = fileContent.length/eachSize;} else{fileNumber = fileContent.length/eachSize+1;}for (int i=0;i<fileNumber;i++){String fileName = srcFile.getName()+"-"+i+".txt";File fi = new File(srcFile.getParent(), fileName);//在當前文件路徑下創建拆分的文件byte[] eachContent;//將源文件內容複製到拆分的文件中if(i!=fileNumber-1){eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1));} else{eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length);}try {FileOutputStream fos = new FileOutputStream(fi);fos.write(eachContent);fos.close();System.out.printf("輸出子文件%s,其大小是%d,每個的大小是%d/n",fi.getAbsoluteFile(),fi.length(),eachContent.length);}catch (Exception e) {// TODO: handle exception e.printStackTrace();}}}}總結
以上就是本文關於java IO流將一個文件拆分為多個子文件代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!