java有幾種文件拷貝方式续挟?哪一種最高效?

java有幾種文件拷貝方式侥衬?哪一種最高效诗祸?

java有多重比較典型的文件拷貝實(shí)現(xiàn)方式:
1、利用java.io.類庫(kù)轴总,直接為源文件構(gòu)建一個(gè)FileInputStream讀取直颅,然后再為目標(biāo)文件構(gòu)建一個(gè)FileOutputStream,完成寫入工作

public static void copyFileByStream(File source, File dest) throws
        IOException {
    try (InputStream is = new FileInputStream(source);
         OutputStream os = new FileOutputStream(dest);){
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    }
 }

2怀樟、利用java.nio類庫(kù)提供的transferTo或transferFrom方式實(shí)現(xiàn)

public static void copyFileByChannel(File source, File dest) throws
        IOException {
    try (FileChannel sourceChannel = new FileInputStream(source)
            .getChannel();
         FileChannel targetChannel = new FileOutputStream(dest).getChannel
                 ();){
        for (long count = sourceChannel.size() ;count>0 ;) {
            long transferred = sourceChannel.transferTo(
                    sourceChannel.position(), count, targetChannel);            sourceChannel.position(sourceChannel.position() + transferred);
            count -= transferred;
        }
    }
 }

java標(biāo)準(zhǔn)類庫(kù)本身提供了幾種Files.copy的實(shí)現(xiàn)
對(duì)于copy的效率功偿,這個(gè)其實(shí)與操作系統(tǒng)和配置等情況相關(guān),總體來(lái)說(shuō)往堡,NIO transferTo/From的方式可能更快脖含,因?yàn)樗芾矛F(xiàn)代操作系統(tǒng)底層機(jī)制,避免不要拷貝和上下文切換投蝉。

拷貝實(shí)現(xiàn)機(jī)制分析

操作系統(tǒng)包含用戶態(tài)空間和內(nèi)核態(tài)空間,操作系統(tǒng)內(nèi)核征堪、硬件驅(qū)動(dòng)運(yùn)行在內(nèi)核態(tài)空間瘩缆,具有較高的特權(quán);而用戶空間佃蚜,則是給普通應(yīng)用和服務(wù)使用庸娱。
當(dāng)使用輸入輸出流進(jìn)行讀寫時(shí),實(shí)際上進(jìn)行了多次上下文切換谐算,比如應(yīng)用讀取數(shù)據(jù)時(shí)熟尉,先在內(nèi)核態(tài)將數(shù)據(jù)從磁盤讀取到內(nèi)核緩存,在切換到用戶態(tài)將數(shù)據(jù)從內(nèi)核緩存讀取到用戶緩存洲脂。


IO

所以斤儿,這種方式會(huì)帶來(lái)一定的額外開銷,可能會(huì)降低 IO 效率恐锦。
而基于NIO transferTo的實(shí)現(xiàn)方式往果,在Linux和Unix上,則會(huì)使用零拷貝技術(shù)一铅,數(shù)據(jù)傳輸并不需要用戶態(tài)參與陕贮,省去上下文切換的開銷和不必要的內(nèi)存拷貝,進(jìn)而可能提高應(yīng)用拷貝性能潘飘。注意肮之,transferTo 不僅僅是可以用在文件拷貝中掉缺,與其類似的,例如讀取磁盤文件戈擒,然后進(jìn)行 Socket 發(fā)送眶明,同樣可以享受這種機(jī)制帶來(lái)的性能和擴(kuò)展性提高。


NIO

NIO Buffer

buffer是NIO操作數(shù)據(jù)的基本工具峦甩,java為每種數(shù)據(jù)類型都提供了相應(yīng)的buffer實(shí)現(xiàn)(布爾除外)


基本數(shù)據(jù)類型buffer

Buffer 有幾個(gè)基本屬性:

  • capcity:它反映這個(gè)buffer到底多大赘来,也就是數(shù)據(jù)長(zhǎng)度
  • postion:要操作的數(shù)據(jù)起始位置
  • limit:相當(dāng)于操作的限額,在讀取或者寫入時(shí)凯傲,limit 的意義很明顯是不一樣的犬辰。比如,讀取操作時(shí)冰单,很可能將 limit 設(shè)置到所容納數(shù)據(jù)的上限幌缝;而在寫入時(shí),則會(huì)設(shè)置容量或容量以下的可寫限度诫欠。
  • mark涵卵,記錄上一次postion的位置,默認(rèn)是0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荒叼,一起剝皮案震驚了整個(gè)濱河市轿偎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌被廓,老刑警劉巖坏晦,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嫁乘,居然都是意外死亡昆婿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蜓斧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仓蛆,“玉大人,你說(shuō)我怎么就攤上這事挎春】锤恚” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵直奋,是天一觀的道長(zhǎng)狼荞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帮碰,這世上最難降的妖魔是什么相味? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮殉挽,結(jié)果婚禮上丰涉,老公的妹妹穿的比我還像新娘拓巧。我一直安慰自己,他們只是感情好一死,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布肛度。 她就那樣靜靜地躺著,像睡著了一般投慈。 火紅的嫁衣襯著肌膚如雪承耿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天伪煤,我揣著相機(jī)與錄音加袋,去河邊找鬼。 笑死抱既,一個(gè)胖子當(dāng)著我的面吹牛职烧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播防泵,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚀之,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捷泞?” 一聲冷哼從身側(cè)響起足删,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锁右,沒(méi)想到半個(gè)月后壹堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骡湖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峻厚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响蕴。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惠桃,靈堂內(nèi)的尸體忽然破棺而出浦夷,到底是詐尸還是另有隱情,我是刑警寧澤辜王,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布劈狐,位于F島的核電站,受9級(jí)特大地震影響呐馆,放射性物質(zhì)發(fā)生泄漏肥缔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一汹来、第九天 我趴在偏房一處隱蔽的房頂上張望续膳。 院中可真熱鬧改艇,春花似錦、人聲如沸坟岔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)社付。三九已至承疲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸥咖,已是汗流浹背燕鸽。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛或,地道東北人绵咱。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熙兔,于是被迫代替她去往敵國(guó)和親悲伶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API住涉,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,556評(píng)論 1 143
  • Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API麸锉,可以替代標(biāo)準(zhǔn)的Java I...
    zhisheng_blog閱讀 1,122評(píng)論 0 7
  • 由于Netty,了解了一些異步IO的知識(shí)舆声,JAVA里面NIO就是原來(lái)的IO的一個(gè)補(bǔ)充花沉,本文主要記錄下在JAVA中I...
    騷的掉渣閱讀 697評(píng)論 0 8
  • 知識(shí)是日積月累的,生活的一點(diǎn)一滴都是知識(shí)的積累媳握。知識(shí)不一定什么什么時(shí)候會(huì)用得上碱屁,積累的多了,總有用得上的蛾找。先學(xué)會(huì)學(xué)...
    招遠(yuǎn)金都ddm寧新茹閱讀 98評(píng)論 0 0
  • 直到我崽出生兩個(gè)月娩脾,我才找到靠譜的代購(gòu),而且她就在我身邊打毛,從此買買買柿赊,一發(fā)不可收拾! 待產(chǎn)包里一部分是在某寶幻枉、母嬰...
    桂圓媽媽121閱讀 181評(píng)論 0 0