电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:3日期:2022-09-01 14:06:05

一、作用:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

實(shí)際操作:

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

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

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

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

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

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

總結(jié)一下,我們在這次改動當(dāng)中都做了什么工作:

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

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

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 深圳律师咨询_深圳律师事务所_华荣【免费在线法律咨询】网 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 江苏大隆凯科技有限公司| 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 氮化镓芯片-碳化硅二极管 - 华燊泰半导体 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 环球电气之家-中国专业电气电子产品行业服务网站! | 广东成考网-广东成人高考网 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 |