您好,登錄后才能下訂單哦!
java中怎么實(shí)現(xiàn)文件切片和合并,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
首先建一個(gè)SplitUtil工具類,在工具類中有三個(gè)方法getSplitFile,getWrite,merge
1,文件拆分代碼
public static void getSplitFile(String file,int count){ //預(yù)分配文件所占用的磁盤空間,在磁盤創(chuàng)建一個(gè)指定大小的文件,“r”表示只讀,“rw”支持隨機(jī)讀寫 try { RandomAccessFile raf = new RandomAccessFile(new File(file), "r"); //計(jì)算文件大小 long length = raf.length(); System.out.println(length); //計(jì)算文件切片后每一份文件的大小 long maxSize = length / count; System.out.println(maxSize); long offset = 0L;//定義初始文件的偏移量(讀取進(jìn)度) //開(kāi)始切割文件 for(int i = 0; i < count - 1; i++){ //count-1最后一份文件不處理 //標(biāo)記初始化 long fbegin = offset; //分割第幾份文件 long fend = (i+1) * maxSize; //寫入文件 offset = getWrite(file, i, fbegin, fend); } //剩余部分文件寫入到最后一份(如果不能平平均分配的時(shí)候) if (length - offset > 0) { //寫入文件 getWrite(file, count-1, offset, length); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
2,getWrite文件寫入代碼
/** * 指定文件每一份的邊界,寫入不同文件中 * @param file 源文件 * @param index 源文件的順序標(biāo)識(shí) * @param begin開(kāi)始指針的位置 * @param end 結(jié)束指針的位置 * @return long */ public static long getWrite(String file,int index,long begin,long end){ long endPointer = 0L; try { //申明文件切割后的文件磁盤 RandomAccessFile in = new RandomAccessFile(new File(file), "r"); //定義一個(gè)可讀,可寫的文件并且后綴名為.tmp的二進(jìn)制文件 RandomAccessFile out = new RandomAccessFile(new File(file + "_" + index + ".tmp"), "rw"); //申明具體每一文件的字節(jié)數(shù)組 byte[] b = new byte[1024]; int n = 0; //從指定位置讀取文件字節(jié)流 in.seek(begin); //判斷文件流讀取的邊界 while(in.getFilePointer() <= end && (n = in.read(b)) != -1){ //從指定每一份文件的范圍,寫入不同的文件 out.write(b, 0, n); } //定義當(dāng)前讀取文件的指針 endPointer = in.getFilePointer(); //關(guān)閉輸入流 in.close(); //關(guān)閉輸出流 out.close(); } catch (Exception e) { e.printStackTrace(); } return endPointer; }
3.文件合并代碼
/** * 文件合并 * @param file 指定合并文件 * @param tempFile 分割前的文件名 * @param tempCount 文件個(gè)數(shù) */ public static void merge(String file,String tempFile,int tempCount){ RandomAccessFile raf = null; try { //申明隨機(jī)讀取文件RandomAccessFile raf = new RandomAccessFile(new File(file), "rw"); //開(kāi)始合并文件,對(duì)應(yīng)切片的二進(jìn)制文件 for (int i = 0; i < tempCount; i++) { //讀取切片文件 RandomAccessFile reader = new RandomAccessFile(new File(tempFile + "_" + i + ".tmp"), "r"); byte[] b = new byte[1024]; int n = 0; while((n = reader.read(b)) != -1){ raf.write(b, 0, n);//一邊讀,一邊寫 } } } catch (Exception e) { e.printStackTrace(); }finally{ try { raf.close(); } catch (IOException e) { e.printStackTrace(); } }
最后在主程序里面調(diào)用就可以了
public static void main(String[] args) { String file = "F:\\java-study\\img\\mv.jpg"; int count = 5; //1.根據(jù)現(xiàn)有的文件編寫文件編寫文件切片工具類 //2.寫入到二進(jìn)制臨時(shí)文件 // getSplitFile(file, count); //3.根據(jù)實(shí)際的需求合并指定數(shù)量的文件 String tempFile = "F:\\java-study\\img\\img.jpg"; merge(file, tempFile, 5); }
關(guān)于java中怎么實(shí)現(xiàn)文件切片和合并問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。