最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、作用:

隨機(jī)流(RandomAccessFile)不屬于IO流,支持對(duì)文件的讀取和寫(xiě)入隨機(jī)訪問(wèn)。

二、隨機(jī)訪問(wèn)文件原理:

首先把隨機(jī)訪問(wèn)的文件對(duì)象看作存儲(chǔ)在文件系統(tǒng)中的一個(gè)大型 byte 數(shù)組,然后通過(guò)指向該 byte 數(shù)組的光標(biāo)或索引(即:文件指針 FilePointer)在該數(shù)組任意位置讀取或?qū)懭肴我鈹?shù)據(jù)。

三、相關(guān)方法說(shuō)明:

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

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

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

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

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

2> 相對(duì)位置:RandowAccessFile.skipByte(int step); 相對(duì)當(dāng)前位置

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

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

  1)下載斷開(kāi)的時(shí)候,記錄文件斷點(diǎn)的位置position;

  2)繼續(xù)下載的時(shí)候,通過(guò)RandomAccessFile找到之前的position位置開(kāi)始下載

實(shí)際操作:

  我們?cè)贒盤(pán)的根目錄下創(chuàng)建一個(gè)名為”test.txt”的文件,文件內(nèi)容很簡(jiǎn)單,如圖所示:

沒(méi)錯(cuò),我們輸入的內(nèi)容就是簡(jiǎn)單的6個(gè)英語(yǔ)字母。然后我們右鍵→屬性:

  我們要實(shí)現(xiàn)的效果很簡(jiǎn)單:將在D盤(pán)的”test.txt”文件寫(xiě)入到E盤(pán)當(dāng)中,但中途我們會(huì)模擬一次”中斷”行為,然后在重新繼續(xù)上傳,最終完成整個(gè)過(guò)程。

  也就是說(shuō),我們這里將會(huì)把“D盤(pán)”視作一臺(tái)電腦,并且直接將”E盤(pán)”視作一臺(tái)服務(wù)器。那么這樣我們甚至都不再與http協(xié)議扯上半毛錢(qián)關(guān)系了,(當(dāng)然實(shí)際開(kāi)發(fā)我們肯定是還是得與它扯上關(guān)系的 ^<^),從而只關(guān)心最基本的文件讀寫(xiě)的”斷”和”續(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) {
    // 源文件與目標(biāo)文件
    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ù)讀寫(xiě)
      while (fis.read(buf) != -1) {
        fos.write(buf);
        // 當(dāng)已經(jīng)上傳了3字節(jié)的文件內(nèi)容時(shí),模擬網(wǎng)絡(luò)中斷了,拋出異常
        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 {
        // 關(guān)閉輸入輸出流
        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ù)讀寫(xiě)
      while (readFile.read(buf) != -1) {
        writeFile.write(buf);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

class FileAccessException extends Exception {
}

總結(jié)一下,我們?cè)谶@次改動(dòng)當(dāng)中都做了什么工作:

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

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

沒(méi)錯(cuò),這個(gè)時(shí)候我們發(fā)現(xiàn)內(nèi)容只有“abc”。這是在我們預(yù)料以內(nèi)的,因?yàn)槲覀兊某绦蚰M在文件上傳了3個(gè)字節(jié)的時(shí)候發(fā)生了中斷。

Ok,我們靜靜的等待10秒鐘過(guò)去,然后再點(diǎn)開(kāi)該文件,看看是否能夠成功:

 

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

迭部县| 福安市| 灵石县| 紫云| 彭泽县| 罗江县| 通州区| 长沙市| 普定县| 古丈县| 咸宁市| 扶余县| 正安县| 邵武市| 酉阳| 大荔县| 民县| 突泉县| 腾冲县| 三门县| 育儿| 高清| 夏河县| 三河市| 罗山县| 敦煌市| 年辖:市辖区| 七台河市| 昭觉县| 中方县| 镇雄县| 扶余县| 饶平县| 称多县| 松阳县| 新田县| 通海县| 凉城县| 兴城市| 南宫市| 河间市|