溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java中怎么實(shí)現(xiàn)文件切片和合并

發(fā)布時(shí)間:2021-06-25 16:38:17 來(lái)源:億速云 閱讀:315 作者:Leah 欄目:編程語(yǔ)言

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í)。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI