欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java文件斷點續(xù)傳實現(xiàn)原理解析

 更新時間:2020年05月18日 14:34:10   作者:myseries  
這篇文章主要介紹了Java文件斷點續(xù)傳實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、作用:

隨機流(RandomAccessFile)不屬于IO流,支持對文件的讀取和寫入隨機訪問。

二、隨機訪問文件原理:

首先把隨機訪問的文件對象看作存儲在文件系統(tǒng)中的一個大型 byte 數(shù)組,然后通過指向該 byte 數(shù)組的光標或索引(即:文件指針 FilePointer)在該數(shù)組任意位置讀取或寫入任意數(shù)據(jù)。

三、相關方法說明:

1、對象聲明:RandomAccessFile raf = newRandomAccessFile(File file, String mode);

其中參數(shù) mode 的值可選 "r":可讀,"w" :可寫,"rw":可讀性;

2、獲取當前文件指針位置:int RandowAccessFile.getFilePointer();

3、改變文件指針位置(相對位置、絕對位置):

1> 絕對位置:RandowAccessFile.seek(int index);

2> 相對位置:RandowAccessFile.skipByte(int step); 相對當前位置

4、給寫入文件預留空間:RandowAccessFile.setLength(long len);

斷點續(xù)傳實現(xiàn)原理:

  1)下載斷開的時候,記錄文件斷點的位置position;

  2)繼續(xù)下載的時候,通過RandomAccessFile找到之前的position位置開始下載

實際操作:

  我們在D盤的根目錄下創(chuàng)建一個名為”test.txt”的文件,文件內容很簡單,如圖所示:

沒錯,我們輸入的內容就是簡單的6個英語字母。然后我們右鍵→屬性:

  我們要實現(xiàn)的效果很簡單:將在D盤的”test.txt”文件寫入到E盤當中,但中途我們會模擬一次”中斷”行為,然后在重新繼續(xù)上傳,最終完成整個過程。

  也就是說,我們這里將會把“D盤”視作一臺電腦,并且直接將”E盤”視作一臺服務器。那么這樣我們甚至都不再與http協(xié)議扯上半毛錢關系了,(當然實際開發(fā)我們肯定是還是得與它扯上關系的 ^<^),從而只關心最基本的文件讀寫的”斷”和”續(xù)”的原理是怎么樣的。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Test {
  private static int position = -1;

  public static void main(String[] args) {
    // 源文件與目標文件
    File sourceFile = new File("D:/", "test.txt");
    File targetFile = new File("E:/", "test.txt");
    // 輸入輸出流
    FileInputStream fis = null;
    FileOutputStream fos = null;
    // 數(shù)據(jù)緩沖區(qū)
    byte[] buf = new byte[1];

    try {
      fis = new FileInputStream(sourceFile);
      fos = new FileOutputStream(targetFile);
      // 數(shù)據(jù)讀寫
      while (fis.read(buf) != -1) {
        fos.write(buf);
        // 當已經上傳了3字節(jié)的文件內容時,模擬網絡中斷了,拋出異常
        if (targetFile.length() == 3) {
          position = 3;
          throw new FileAccessException();
        }
      }

    } catch (FileAccessException e) {
      keepGoing(sourceFile, targetFile, position);
    } catch (FileNotFoundException e) {
      System.out.println("指定文件不存在");
    } catch (IOException e) {

    } finally {
      try {
        // 關閉輸入輸出流
        if (fis != null)
          fis.close();

        if (fos != null)
          fos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  private static void keepGoing(File source, File target, int position) {
    try {
      Thread.sleep(10000);
    } catch (Exception e) {
      e.printStackTrace();
    }

    try {
      RandomAccessFile readFile = new RandomAccessFile(source, "rw");
      RandomAccessFile writeFile = new RandomAccessFile(target, "rw");

      readFile.seek(position);
      writeFile.seek(position);

      // 數(shù)據(jù)緩沖區(qū)
      byte[] buf = new byte[1];
      // 數(shù)據(jù)讀寫
      while (readFile.read(buf) != -1) {
        writeFile.write(buf);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

class FileAccessException extends Exception {
}

總結一下,我們在這次改動當中都做了什么工作:

  • 首先,我們定義了一個變量position,記錄在發(fā)生中斷的時候,已完成讀寫的位置。(這是為了方便,實際來說肯定應該講這個值存到文件或者數(shù)據(jù)庫等進行持久化)
  • 然后在文件讀寫的while循環(huán)中,我們去模擬一個中斷行為的發(fā)生。這里是當targetFile的文件長度為3個字節(jié)則模擬拋出一個我們自定義的異常。(我們可以想象為實際下載中,已經上傳(下載)了”x”個字節(jié)的內容,這個時候網絡中斷了,那么我們就在網絡中斷拋出的異常中將”x”記錄下來)。
  • 剩下的就如果我們之前說的一樣,在“續(xù)傳”行為開始后,通過RandomAccessFile類來包裝我們的文件,然后通過seek將指針指定到之前發(fā)生中斷的位置進行讀寫就搞定了。(實際的文件下載上傳,我們當然需要將保存的中斷值上傳給服務器,這個方式通常為httpConnection.setRequestProperty(“RANGE”,”bytes=x”);)

在我們這段代碼,開啟”續(xù)傳“行為,即keepGoing方法中:我們起頭讓線程休眠10秒鐘,這正是為了讓我們運行程序看到效果。
現(xiàn)在我們運行程序,那么文件就會開啟“由D盤上傳到E盤的過程”,我們首先點開E盤,會發(fā)現(xiàn)的確多了一個test.txt文件,打開它發(fā)現(xiàn)內容如下:

沒錯,這個時候我們發(fā)現(xiàn)內容只有“abc”。這是在我們預料以內的,因為我們的程序模擬在文件上傳了3個字節(jié)的時候發(fā)生了中斷。

Ok,我們靜靜的等待10秒鐘過去,然后再點開該文件,看看是否能夠成功:

 

通過截圖我們發(fā)現(xiàn)內容的確已經變成了“abc”,由此也就完成了續(xù)傳。

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

相關文章

  • java小知識之查詢數(shù)據(jù)庫數(shù)據(jù)的元信息

    java小知識之查詢數(shù)據(jù)庫數(shù)據(jù)的元信息

    這篇文章主要給大家介紹了關于java小知識之查詢數(shù)據(jù)庫數(shù)據(jù)的元信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-10-10
  • springmvc使用REST出現(xiàn):Request?method?'PUT'?not?supported問題

    springmvc使用REST出現(xiàn):Request?method?'PUT'?not?sup

    這篇文章主要介紹了springmvc使用REST出現(xiàn):Request?method?'PUT'?not?supported問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java類加載機制實現(xiàn)步驟解析

    Java類加載機制實現(xiàn)步驟解析

    這篇文章主要介紹了Java類加載機制實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java添加Word文本水印和圖片水印

    Java添加Word文本水印和圖片水印

    這篇文章主要介紹了Java添加Word文本水印和圖片水印,文章圖文講解的很清晰,有對于這方面不懂得同學可以學習下
    2021-02-02
  • FeignClientFactoryBean創(chuàng)建動態(tài)代理詳細解讀

    FeignClientFactoryBean創(chuàng)建動態(tài)代理詳細解讀

    這篇文章主要介紹了FeignClientFactoryBean創(chuàng)建動態(tài)代理詳細解讀,當直接進去注冊的方法中,一步步放下走,都是直接放bean的定義信息中放入值,然后轉成BeanDefinitionHolder,最后在注冊到IOC容器中,需要的朋友可以參考下
    2023-11-11
  • java JOptionPane類的介紹

    java JOptionPane類的介紹

    java JOptionPane類的介紹,需要的朋友可以參考一下
    2013-04-04
  • Jmeter結構體系及運行原理順序解析

    Jmeter結構體系及運行原理順序解析

    這篇文章主要介紹了Jmeter結構體系及運行原理順序解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 簡單了解Spring Boot及idea整合jsp過程解析

    簡單了解Spring Boot及idea整合jsp過程解析

    這篇文章主要介紹了簡單了解Spring Boot及idea整合jsp過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例

    SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例

    本篇文章主要介紹了SSM使用mybatis分頁插件pagehepler實現(xiàn)分頁示例,使用分頁插件的原因,簡化了sql代碼的寫法,實現(xiàn)較好的物理分頁,非常具有實用價值,需要的朋友可以參考下
    2018-03-03
  • MapStruct實體轉換及List轉換的方法講解

    MapStruct實體轉換及List轉換的方法講解

    今天小編就為大家分享一篇關于MapStruct實體轉換及List轉換的方法講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論