中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java實現文件切割拼接的實現代碼

發布時間:2020-10-18 02:11:41 來源:腳本之家 閱讀:176 作者:LudwigWuuu 欄目:編程語言

單線程實現

文件分割

在老的FAT32文件系統中,最大的單個文件大小必須保存在4G內,對于經常看電影的我這個是不能允許的。不過現在Windows有NTFS文件系統,Linux大部分發行版為Ext4文件系統,最大單個文件大小能大于4G。不過這二者并不能兼容。。格式化NTFS的U盤Linux不能識別,格式化Ext4的U盤Windows不能識別,只能用老的FAT32兼容二者。所以將文件分割,再進行拼接就很重要,文件經過分割了在網絡上傳輸就十分方便,也能開多線程對每部分進行HASH提高處理效率。

Java實現文件切割拼接的實現代碼

最近看的BradPitt的《狂怒》

首先:對文件進行分割需要確定每一部分的大小,假設上面的 Fury.mkv 文件大小為 280M ,分割每一塊設置默認大小為 64M ,所以:

Java實現文件切割拼接的實現代碼

對于最后一塊,一般小于等于設定好的每塊默認大小。 每塊大小設置好了,接下來,就需要將文件的路徑獲取,代碼中搭建輸入流,將文件讀入內存緩沖區中,再搭建輸出流,將緩沖區輸出到新的分割文件中。 再接下來實現就很簡單了。 新建一個 FileSlice

類:有切割方法,拼接方法。

public class FileSlice {
 /**
  * 分割文件
  * @param filePath 文件路徑
  * @param filePieceSize 文件每塊大小,單位為字節,為-1則默認為每塊64M
  * @return 成功返回True,出錯則返回False
  */
 public static boolean slice(Path filePath, int filePieceSize){
  return true;
 }

 /**
  * 將分割好的文件重新鏈接
  * @param filePath 被分割好的其中之一文件路徑,默認其他塊與其在同一目錄下
  * @param howManyParts 一共有多少塊
  * @return 成功返回True,出錯則返回False
  */
 public static boolean glue(Path filePath, int howManyParts){
  return true;
 }
}

接下來實現單線程的分割方法: 用圖解的話應該是這樣:

Java實現文件切割拼接的實現代碼

代碼實現: 進入函數首先判斷文件是否存在:

if (!Files.exists(filePath)){
 return false;
}

接下來判斷每塊大小是否使用默認值:

if(filePieceSize == -1){
 filePieceSize = 1024*1024*64;
}

將路徑轉換為文件對象,再計算將分割多少塊:

File file = filePath.toFile();
int howManyParts = (int) Math.ceil(file.length() / (double)filePieceSize);

初始化輸入輸出流,出錯輸出錯誤信息,返回false,獲得當前目錄:

DataInputStream fileReader = null;
try {
 fileReader = new DataInputStream(new FileInputStream(file));
} catch (FileNotFoundException e) {
 e.printStackTrace();
 System.out.println("文件找不到!");
 return false;
}
DataOutputStream fileWriter;
Path dir = filePath.getParent();

接下來讀取文件,并且分別輸出到各個part文件中:

int readLength = -1;
long total = 0;

try {
 for (int i = 1; i <= howManyParts ; i++){
  //新建文件part i
  Path temp = Files.createFile(dir.resolve(filePath.getFileName() + ".part" + i));
  //搭建輸出流
  fileWriter = new DataOutputStream(new FileOutputStream(temp.toFile()));
  //讀取文件并輸出
  while ( (readLength = fileReader.read(buffer)) != -1){
   fileWriter.write(buffer,0,readLength);
   fileWriter.flush();
   total += readLength;
   if (total == filePieceSize){
    total = 0;
    break;
   }
  }
  //part i的文件已經輸出完畢,關閉流
  fileWriter.close();
 }
 //讀取完畢,關閉輸入流
 fileReader.close();
} catch (IOException e) {
 e.printStackTrace();
 System.out.println("IO錯誤!");
 return false;
}

該函數已經實現完畢,接下來測試(由于電影Fury有14G。。太大了。。還是換個吧):

Java實現文件切割拼接的實現代碼

我是大哥大第5集,有729M,大概能分個12個part吧。

public static void main(String[] args) throws IOException {
 double before = System.currentTimeMillis();

 Path bigboss = Paths.get("D:\\Video\\我是大哥大\\我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4");

 FileSlice.slice(bigboss,-1);

 double after = System.currentTimeMillis();

 System.out.println("分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4," + Files.size(bigboss) + "字節,總用時" + (after - before) + "ms" );

}

運行結果:

分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4,765321889字節,總用時16335.0ms

Java實現文件切割拼接的實現代碼

速度還是挺慢的。。 下次還是換成多線程來實現,再來測試下速度。在單線程情況下一個普通的40分鐘日劇都要15-30s左右,要是mkv格式的電影都要好久了。。不過其實極限應該不在CPU中執行的速度,而是在硬盤IO中,如果是普通硬盤那么就算是多線程也應該提速不了多少。。

文件拼接

這個就很簡單了,和分割相反就OK。 直接上完整代碼:

public static boolean glue(Path filePath, int howManyParts){
 if (!Files.exists(filePath)){
  return false;
 }
 //獲取原始文件名
 String filename = getOriginalFileName(filePath.getFileName().toString());

 if (filename == null){
  System.out.println("傳入part文件名解析出錯!");
  return false;
 }
 //初始化緩沖區
 byte [] buffer = new byte[1024 * 8];
 //獲取文件存儲的路徑
 Path dir = filePath.getParent();

 try {
  DataInputStream fileReader = null;
  //創建原始文件
  Files.createFile(dir.resolve(filename));
  //搭建原始文件輸出流
  DataOutputStream fileWriter = new DataOutputStream(new FileOutputStream(dir.resolve(filename).toFile()));

  int readLength = -1;
  for (int i = 1; i <= howManyParts ; i++){
   //得到part i文件路徑
   Path temp = dir.resolve(filename + ".part" + i);
   //搭建輸入流
   fileReader = new DataInputStream(new FileInputStream(temp.toFile()));
   //讀取文件并輸出
   while ( (readLength = fileReader.read(buffer)) != -1){
    fileWriter.write(buffer,0,readLength);
    fileWriter.flush();
   }
   //part i的文件已經讀入完畢,關閉流
   fileReader.close();
  }
  //寫入完畢,關閉輸出流
  fileWriter.close();
 } catch (IOException e) {
  e.printStackTrace();
  System.out.println("IO錯誤!");
  return false;
 }
 return true;
}

再測試剛剛分割好的我是大哥大第5集

public static void main(String[] args) throws IOException {
 double before = System.currentTimeMillis();

 Path bigboss = Paths.get("D:\\Video\\我是大哥大\\我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4.part1");

 FileSlice.glue(bigboss,12);

 double after = System.currentTimeMillis();

 System.out.println("拼接12個part,用時" + (after - before) + "ms");

}

結果輸出,用12s左右,還行。

拼接12個part,用時12147.0ms

打開播放毫無問題,最后截張圖。

Java實現文件切割拼接的實現代碼

未完待續。。下次來使用多線程進行實現。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清徐县| 尖扎县| 会泽县| 宽甸| 梓潼县| 远安县| 山东省| 启东市| 耿马| 全南县| 昌吉市| 卫辉市| 清徐县| 徐州市| 东兰县| 中宁县| 沁水县| 南平市| 大埔县| 墨竹工卡县| 新巴尔虎左旗| 贵州省| 瓮安县| 海口市| 阳新县| 年辖:市辖区| 龙海市| 视频| 玉林市| 峨眉山市| 桐梓县| 西华县| 灵璧县| 徐水县| 德令哈市| 大理市| 奉贤区| 青川县| 望都县| 乐业县| 华宁县|