java文件拷貝_Java實現文件拷貝的4種方法

第一種方法:古老的方式

public?static?long?forJava(File?f1,File?f2)?throws?Exception{

long?time=new?Date().getTime();

int?length=2097152;

FileInputStream?in=new?FileInputStream(f1);

FileOutputStream?out=new?FileOutputStream(f2);

byte[]?buffer=new?byte[length];

while(true){

int?ins=in.read(buffer);

if(ins==-1){

in.close();

out.flush();

out.close();

return?new?Date().getTime()-time;

}else

out.write(buffer,0,ins);

}

}

方法的2參數分別是原始文件,和拷貝的目的文件.這里不做過多介紹.

實現方法很簡單,分別對2個文件構建輸入輸出流,并且使用一個字節數組作為我們內存的緩存器, 然后使用流從f1 中讀出數據到緩存里,在將緩存數據寫到f2里面去.這里的緩存是2MB的字節數組

第2種方法:使用NIO中的管道到管道傳輸

public?static?long?forTransfer(File?f1,File?f2)?throws?Exception{

long?time=new?Date().getTime();

int?length=2097152;

FileInputStream?in=new?FileInputStream(f1);

FileOutputStream?out=new?FileOutputStream(f2);

FileChannel?inC=in.getChannel();

FileChannel?outC=out.getChannel();

int?i=0;

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.close();

return?new?Date().getTime()-time;

}

if((inC.size()-inC.position())<20971520)

length=(int)(inC.size()-inC.position());

else

length=20971520;

inC.transferTo(inC.position(),length,outC);

inC.position(inC.position()+length);

i++;

}

}

實現方法:在第一種實現方法基礎上對輸入輸出流獲得其管道,然后分批次的從f1的管道中像f2的管道中輸入數據每次輸入的數據最大為2MB

方法3:內存文件景象寫(讀文件沒有使用文件景象,有興趣的可以回去試試,,我就不試了,估計會更快)

public?static?long?forImage(File?f1,File?f2)?throws?Exception{

long?time=new?Date().getTime();

int?length=2097152;

FileInputStream?in=new?FileInputStream(f1);

RandomAccessFile?out=new?RandomAccessFile(f2,"rw");

FileChannel?inC=in.getChannel();

MappedByteBuffer?outC=null;

MappedByteBuffer?inbuffer=null;

byte[]?b=new?byte[length];

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.force();

out.close();

return?new?Date().getTime()-time;

}

if((inC.size()-inC.position())

length=(int)(inC.size()-inC.position());

}else{

length=20971520;

}

b=new?byte[length];

inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);

inbuffer.load();

inbuffer.get(b);

outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);

inC.position(b.length+inC.position());

outC.put(b);

outC.force();

}

}

實現方法:跟傷2個例子不一樣,這里寫文件流沒有使用管道而是使用內存文件映射(假設文件f2在內存中).在循環中從f1的管道中讀取數據到字節數組里,然后在像內存映射的f2文件中寫數據.

第4種方法:管道對管道

public?static?long?forChannel(File?f1,File?f2)?throws?Exception{

long?time=new?Date().getTime();

int?length=2097152;

FileInputStream?in=new?FileInputStream(f1);

FileOutputStream?out=new?FileOutputStream(f2);

FileChannel?inC=in.getChannel();

FileChannel?outC=out.getChannel();

ByteBuffer?b=null;

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.close();

return?new?Date().getTime()-time;

}

if((inC.size()-inC.position())

length=(int)(inC.size()-inC.position());

}else

length=2097152;

b=ByteBuffer.allocateDirect(length);

inC.read(b);

b.flip();

outC.write(b);

outC.force(false);

}

}

這里實現方式與第3種實現方式很類似,不過沒有使用內存影射.

下面是對49.3MB的文件進行拷貝的測試時間(毫秒)

Start Copy File... ?file size:50290KB

CopyFile:b1.rmvb mode:forChannel ?RunTime:3203

CopyFile:b1.rmvb mode:forImage ?RunTime:3328

CopyFile:b1.rmvb mode:forJava ?RunTime:2172

CopyFile:b1.rmvb mode:forTransfer RunTime:1406

End Copy File!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273136.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

今夜的硬件之旅

6腳繼電器&#xff1a; 匯科繼電器HK4100F-DC6V-SHG ①3A觸點切換能力 ②具有一組常開&#xff0c;一組轉換觸點形式 ③超小型&#xff0c;標準印刷制版引出腳 ④有塑封型 Outline&#xff08;L*W*H&#xff09;外形尺寸&#xff1a;15.510.511.8 Contact Date觸電形式&#…

mp3 pcm java_Java mp3文件轉pcm文件

Java mp3文件轉pcm文件package cn.zpy.util;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFileFormat;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;imp…

有1~5000一組亂序數列,請使用偽代碼對該數進行排列

先把1-5000組成一個數組 冒泡排序法 $arrarray(1,2,3,4,5,6,7,8,9.....5000); $totalcount($arr); For($i0;$i<$total;$i){ For($j0;$j<$total-1;$j){ If($arr[$j]>$arr[$j1]){ $tmp$arr[$i]; $arr[$j]$arr[$j1]; $arr[$j1]$tmp; } } } 快速排序法 $arrarray(1,2,3,4,…

java 類型轉換方法_java數據類型轉換的常見方法

public class Testfun {public static void main(String[] args) {// (一)跨Number父類的類型轉換// 1、str轉int > Integer.parseInt(s1)String s1 "19";int i2 Integer.parseInt(s1);// 數字str轉化為對標的intSystem.out.println("i2" (i2));// 2…

json to java 在線_Json轉Java對象 (全網最簡版)

Json2Java(全網最簡版)json字符串轉Java對象,生成對應文件描述&特點簡易的Json轉Java工具,滿足基本日常使用(特殊需求可自行增添,代碼就一頁)在網上找了好些個這類工具,不是只暴露iead插件就是復雜&沒文檔,于是自己寫了個全網最簡版Json2Javaonly one file用法public c…

Material design 色彩

八月已過去&#xff0c;九月剛來到~暑假已過去~九月上學季~~又迎來了一個桂花飄香的季節&#xff0c;你是否有了新的目標和計劃~~所以在九月初始給大家帶來一個全新的東西&#xff08;ps&#xff1a;對于我來說是全新的東西&#xff09;——Material Design~~九月讓我們一起好好…

java logging api_Java Logging API - Tutorial

1.2. 創建一個logger包 java.util.logging提供了日志的功能&#xff0c;可以使用類似于下面的代碼來創建一個logger&#xff1a;import java.util.logging.Logger;private final static Logger LOGGER Logger.getLogger(MyClass.class .getName());1.3. LevelLog的等級反映了問…

內存查看工具RAMMAP說明

參考 Technet Process Private: 分配給單一Process專用的內存 Mapped File: 用來儲放檔案內容快取(Cache)的內存空間 Shared Memory: 標注給多個Process共用的內存分頁(Page&#xff0c;內存管理單位) Page Table: 用來描述虛擬內存位址的分頁表(裡面是一筆一筆的PTE&…

php接口和java接口_java和php接口的區別是什么

java和php接口的區別是&#xff1a;1、php接口中的抽象方法只能是public的&#xff0c;默認也是public權限&#xff1b;2、java中私有方法使用private修飾&#xff0c;供接口中的默認方法或者靜態方法調用。【相關學習推薦&#xff1a;php編程(視頻)】php:規范&#xff1a;接口…

成都優步uber司機第四組獎勵政策

萬能的優步成都團隊放出了優步司機第四組&#xff0c;一二三組獎勵已經驟降&#xff0c;在月末放出第四組車主檔&#xff0c;這是要讓一切歸于平靜的節奏么&#xff01;&#xff01;&#xff01; 滴滴快車單單2.5倍&#xff0c;注冊地址&#xff1a;http://www.udache.com/如何…

java hql多條件查詢_使用hql語句怎樣實現多條件查詢

展開全部這里只寫了DAO和業務62616964757a686964616fe59b9ee7ad9431333264623331邏輯組件、ACTION的具體實現類&#xff0c;PO和和接口自己應該會寫吧&#xff0c;HQL采用的是結合SQL的那種寫法&#xff0c;增刪改查全在里面了&#xff0c;修改下馬上就能跑了&#xff0c;不清楚…

BZOJ 1008 [HNOI2008]越獄

1008: [HNOI2008]越獄 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5166 Solved: 2242[Submit][Status][Discuss]Description 監獄有連續編號為1...N的N個房間&#xff0c;每個房間關押一個犯人&#xff0c;有M種宗教&#xff0c;每個犯人可能信仰其中一種。如果相鄰房間…

android mysql開發工具_Android開發工具--adb的使用

adb(Android Debug Bridge)是Android提供的一個通用的調試工具&#xff0c;借助這個工具&#xff0c;我們可以管理設備或手機模擬器的狀態。還可以進行以下的操作&#xff1a;1、快速更新設備或手機模擬器中的代碼&#xff0c;如應用或Android系統升級&#xff1b;2、在設備上運…

java headless_使用Chrome Headless 快速實現java版數據的抓取

Java: cdp4j - Java library for CDP,使用這個類庫實現。maven引入&#xff1a;io.webfoldercdp4j1.1.0官方例子&#xff1a;import io.webfolder.cdp.Launcher;import io.webfolder.cdp.session.Session;import io.webfolder.cdp.session.SessionFactory;public class HelloWo…

閃回數據庫

Flashbacking a database means going back to a previous database state.閃回數據庫到之前數據庫的狀態The Flashback Database feature provides a way to quickly revert entire Oracle database to the state it was in at a past point in time. 閃回數據庫特性提供了一種…

Ruby on Rails Tutorial 第六章 用戶模型

1、用戶模型&#xff08;1&#xff09;數據庫遷移Rails默認使用關系數據庫存儲數據&#xff0c;數據庫中的表有數據行組成&#xff0c;每一行都有相應的列&#xff0c;對應數據屬性。把列名命名為相應的名字后&#xff0c;ActiveRecord會自動把他們識別為用戶對象的屬性。 $ ra…

java dcl 失效解決_DCL失效原因和解決方案

Java內存模型 在了解Java的同步秘密之前&#xff0c;先來看看JMM(Java Memory Model)。Java被設計為跨平臺的語言&#xff0c;在內存管理上&#xff0c;顯然也要有一個統一的模型。而且Java語言最大的特點就是廢除了指針&#xff0c;把程序員從痛苦中解脫出來&#xff0c;不…

李寧-2015年7月13日-個人文檔

姓名 李寧 日期 2015年7月13日 主要工作及心得 由于我負責服務器端的編寫工作&#xff0c;而各部分的客戶端的操作都要與服務器端通信&#xff0c;所以在今天的調試中&#xff0c;我貫穿于各部分模塊的調試和檢測&#xff0c;主要負責在出現問題…

java.net.unknown_android -------- java.net.UnknownServiceException

最近升級了Android的API版本時 &#xff0c;導致我的網絡請求失敗了&#xff0c;出現了這個錯誤 java.net.UnknownServiceException&#xff0c;這個錯誤&#xff0c;我在網上查到這個主要是由于&#xff0c;我們的OkHttp3會默認使用密文傳輸&#xff0c;而我們的代碼中使用Htt…

無憂開通了博客園博客主頁

無憂開通了博客園博客主頁&#xff0c;今后在這里安家了。 分享一點工作經驗和學習心得&#xff0c;有事沒事常來看看。另一個獨立博客www.wuyouseo.com 轉載于:https://www.cnblogs.com/wuyoublog/p/4646481.html