第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

byte[]讀取和Buffered讀取是不是一直是byte讀取快

之前看老師試了copyFile 和copyFileByBuffered,發(fā)現(xiàn)copyFile要快,然后自己去測(cè)試,就發(fā)現(xiàn)

讀取速度byte[] buf=new byte[8*1024];和這個(gè)有關(guān),我往上調(diào)了,那么這兩個(gè)優(yōu)劣在哪里

正在回答

4 回答

同樣條件下,是應(yīng)該Buffer比普通的讀取快,但不是最快的,最快是用FileInputStream的getChannel()方法去讀取。你可以運(yùn)行下面的那段代碼去對(duì)比下就知道了。

package?imooc.io;

import?java.io.BufferedInputStream;
import?java.io.BufferedOutputStream;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.nio.channels.FileChannel;

public?class?CopyFileTest?{

	/**
	?*?@param?args
	?*/
	public?static?void?main(String[]?args)?{
		
		try?{
			Long?start,end;
			start?=?System.currentTimeMillis();
			copyFileNormal(new?File("D:\\javaio\\1.mp3"),new?File("D:\\javaio\\2.mp3"));
			end?=?System.currentTimeMillis();
			System.out.println("運(yùn)行copy?file?的普通方法需要的時(shí)間是:?"?+?(end?-?start)?+?"毫秒");
			
			start?=?System.currentTimeMillis();
			copyFileBuffer(new?File("D:\\javaio\\1.mp3"),new?File("D:\\javaio\\3.mp3"));
			end?=?System.currentTimeMillis();
			System.out.println("運(yùn)行copy?file?的buffer普通方法需要的時(shí)間是:?"?+?(end?-?start)?+?"毫秒");
			
			start?=?System.currentTimeMillis();
			copyFileChannel("D:\\javaio\\1.mp3","D:\\javaio\\4.mp3");
			end?=?System.currentTimeMillis();
			System.out.println("運(yùn)行copy?file?的getChannel()方法需要的時(shí)間是:?"?+?(end?-?start)?+?"毫秒");
		}?catch?(IOException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}

	}
	
	//copy?file?的普通方法
	public?static?void?copyFileNormal(File?inFile,?File?outFile)?throws?IOException{
		FileInputStream?fis?=?new?FileInputStream(inFile);
		FileOutputStream?fos?=?new?FileOutputStream(outFile);
		byte[]?buf?=?new?byte[1024];
		int?len?=?0;
		while((len?=?fis.read(buf))?!=?-1){
			fos.write(buf,?0,?len);
			fos.flush();
		}
		fis.close();
		fos.close();
	}
	
	//copy?file?的buffer普通方法
	public?static?void?copyFileBuffer(File?inFile,?File?outFile)?throws?IOException{
		BufferedInputStream?buffis?=?new?BufferedInputStream(	new?FileInputStream(inFile));
		BufferedOutputStream?buffos?=?new?BufferedOutputStream(	new?FileOutputStream(outFile));
		byte[]?buf?=?new?byte[1024];
		int?len?=?0;
		while((len?=?buffis.read(buf))?!=?-1){
			buffos.write(buf,?0,?len);
			buffos.flush();
		}
		buffis.close();
		buffos.close();
	}
	
	//copy?file?的getChannel()方法
	public?static?void?copyFileChannel(String?inFile,?String?outFile)?throws?IOException{
		FileInputStream?fis?=?new?FileInputStream(inFile);
		FileOutputStream?fos?=?new?FileOutputStream(outFile);
		FileChannel?fcin?=?fis.getChannel();
		FileChannel?fcout?=?fos.getChannel();
		fcin.transferTo(0,?fcin.size(),?fcout);
		
		fis.close();
		fos.close();
		fcin.close();
		fcout.close();
	}
}

下面是運(yùn)行結(jié)果:

運(yùn)行copy file 的普通方法需要的時(shí)間是: 94毫秒

運(yùn)行copy file 的buffer普通方法需要的時(shí)間是: 62毫秒

運(yùn)行copy file 的getChannel()方法需要的時(shí)間是: 16毫秒


0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

能悟能 提問者

非常感謝!
2016-04-20 回復(fù) 有任何疑惑可以回復(fù)我~

這個(gè)問題首先要明白,讀取和寫入的過程;

知道運(yùn)行內(nèi)存吧???計(jì)算機(jī)為什么要運(yùn)行內(nèi)存呢???其實(shí)運(yùn)行內(nèi)存就是一個(gè)緩沖區(qū)??!

文件的讀取和寫入操作的過程是這樣的:

(1)首先說一下批量讀取和單個(gè)字節(jié)的讀取

批量讀取是new一個(gè)對(duì)象,new一個(gè)對(duì)象就是在內(nèi)存中申請(qǐng)一個(gè)和new的要求的大小相一致的運(yùn)行內(nèi)存;

單個(gè)讀取系統(tǒng)默認(rèn)申請(qǐng)了一個(gè)字節(jié)的運(yùn)行內(nèi)存;

(2)文件的讀取和寫入

?1.先說單個(gè)字節(jié)的讀取,從原文件中讀取一個(gè)字節(jié)放入到內(nèi)存中,再?gòu)膬?nèi)存中把一個(gè)字節(jié)大小的數(shù)據(jù)放入到目標(biāo)文件中;(強(qiáng)調(diào)一次操作必須是直接從源文件到內(nèi)存再到目標(biāo)文件, 才能再次讀取下個(gè)字節(jié))

2.再說批量讀取,同理

從原文件中讀取多個(gè)字節(jié)放入到內(nèi)存中,再?gòu)膬?nèi)存中把多個(gè)字節(jié)大小的數(shù)據(jù)放入到目標(biāo)文件中;(強(qiáng)調(diào)一次操作必須是直接從源文件到內(nèi)存再到目標(biāo)文件, 才能再次讀取下多字節(jié))

(3)從2中我們就能理解Buffer的運(yùn)行機(jī)制了,開始解釋(再?gòu)?qiáng)調(diào)一下運(yùn)存既是緩存區(qū))

buffer的單個(gè)讀取,同理讀取既是先讀取一個(gè)字節(jié)放入內(nèi)存中,在讀取一個(gè)字節(jié)中,直到讀取完整個(gè)文件,批量從緩存中放到目標(biāo)文件中,可以看粗這樣節(jié)省了一次一次的從內(nèi)存中到目標(biāo)文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費(fèi)2步,變成只花費(fèi)了一步,所以buffer的性能應(yīng)該是正常的一倍)

buffer的批量讀取,同理讀取既是先讀取多個(gè)字節(jié)放入內(nèi)存中,在讀取多個(gè)字節(jié)中,直到讀取完整個(gè)文件,批量從緩存中放到目標(biāo)文件中,可以看粗這樣節(jié)省了一次一次的從內(nèi)存中到目標(biāo)文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費(fèi)2步,變成只花費(fèi)了一步,所以buffer的性能應(yīng)該是正常的一倍)

(4)總結(jié),累死我了,以上內(nèi)容純屬自己瞎想,沒有驗(yàn)證,求大神驗(yàn)證,告訴我答案,

? ? 我是渣渣,我是新手,驗(yàn)證發(fā)現(xiàn)我說的錯(cuò)了,請(qǐng)不要罵我,xiexie


2 回復(fù) 有任何疑惑可以回復(fù)我~

我認(rèn)為buffered緩沖與byte[]數(shù)組搭配使用最快,如果把復(fù)制比作水換缸,byte[]相當(dāng)于用瓢舀水,buffered相當(dāng)于用水桶轉(zhuǎn)移水,單用瓢或者單用桶都不如組合使用效率高.之所以視頻中buffered比byte[]慢,我認(rèn)識(shí)是因?yàn)檠h(huán)每次都flush了buffered緩沖區(qū),造成一瓢水剛舀進(jìn)桶里就拿著桶去轉(zhuǎn)移這一瓢水了,完全沒有等桶滿了,沒有體現(xiàn)出緩沖區(qū)緩沖的作用,而白白浪費(fèi)了運(yùn)算buffered的時(shí)間,在循環(huán)結(jié)束后再flush buffered緩沖區(qū)用時(shí)會(huì)大大減少.推薦去看看極客學(xué)院這節(jié)視頻,你就明白搭配使用的優(yōu)點(diǎn)了.

??????????????????????????????????????????????????????????????????????????????????????????????????????????????------以上純屬新手見解,懇請(qǐng)大神指正.

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

怒放的生命012

回答得很好,老師再循環(huán)中刷新,其實(shí)Buffer的優(yōu)勢(shì)并沒有體現(xiàn)出來,還是相當(dāng)于用瓢舀水;最后刷新是相當(dāng)于把水都集中,最后整體倒入桶中;
2016-07-01 回復(fù) 有任何疑惑可以回復(fù)我~
#2

染紅_街道

恩,發(fā)現(xiàn)了,會(huì)慢點(diǎn),但是還是比那個(gè)不帶緩沖的快,到底快到哪了 求教
2016-07-03 回復(fù) 有任何疑惑可以回復(fù)我~

如果用帶緩沖批量字節(jié)讀取那么速度一定比不帶緩沖批量字節(jié)讀取的速度快

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

染紅_街道

不一定,如果一次性讀取文件完畢再寫入,不一定比他慢
2016-07-03 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
文件傳輸基礎(chǔ)——Java IO流
  • 參與學(xué)習(xí)       133812    人
  • 解答問題       1058    個(gè)

為您介紹IO流的使用,以及對(duì)象的序列化和反序列化的內(nèi)容

進(jìn)入課程

byte[]讀取和Buffered讀取是不是一直是byte讀取快

我要回答 關(guān)注問題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)