關於java讀寫速度的考證

2021-06-08 02:50:50 字數 4061 閱讀 2721

bufferedreader br = new bufferedreader(new filereader(args[0]));

bufferedwriter bw=new bufferedwriter(new filewriter(args[1]));

string line;

while((line=br.readline())!=null)

bw.flush();

bw.close();

br.close();

引數可以自己選用。

2. randomaccessfile

這一種方法不常用,是隨機讀取的方式,這種方式比較特殊,他不隸屬於inputstream,outputstream類系,他是直接繼承自object類的。randomaccessfile的工作方式是,把datainputstream和dataoutputstream粘起來,再加上它自己的一些方法,比如定位用的getfilepointer( ),在檔案裡移動用的seek( ),以及判斷檔案大小的length( )。此外,它的建構函式還要乙個表示以唯讀方式("r"),還是以讀寫方式("rw")開啟檔案的引數 (和c的fopen( )一模一樣)。它不支援只寫檔案,從這一點上看,假如randomaccessfile繼承了datainputstream,它也許會幹得更好。

randomaccessfile read = new randomaccessfile(args[0],"r");   

randomaccessfile writer = new randomaccessfile(args[1],"rw");   

byte b = new byte[1024*1024];

int count;

while((count=read.read(b))!=-1)

else writer.write(b);   

}   

writer.close();   

read.close();

引數選擇可以根據後邊標記讀寫的進行選擇,比如說第二個引數是"r",說明這是乙個讀檔案的,如果是"rw",說明是寫檔案的。

3. fileinputstream,fileoutputsteam

這是乙個最基本的讀寫檔案的方式,這種讀寫一般是讀取乙個位元組,或者定義長度的位元組個數,如果為了節約時間的話,建議用緩衝區讀寫,這樣速度會快一點。

inputstream in=new fileinputstream(new file(args[0]));

outputstream out=new fileoutputstream(new file(args[1]));

int count;

byte b=new byte[1024*1024];

while((count=in.read(b))!=-1)

else out.write(b);

}in.close();

out.flush();

out.close();

引數和第乙個選擇一樣。

4. 記憶體直接對映

這是乙個記憶體直接對映讀取的方式,如果檔案大小合適,其他讀取方式相對於他來說就是浮雲啊,等一下我把各個大小的比對時間放上,大家應該可以看出來。但是這有乙個限制,就是如果檔案太大的話,對映記憶體會出現問題,要麼就是記憶體不夠,或者就是讀取很慢,我覺得應該是檔案太大,對映記憶體會出現不夠的現象,然後記憶體會啟動換入換出之類的,會浪費時間。但是基本的檔案讀寫,他還是秒殺的。

filechannel read = new randomaccessfile(args[0],"r").getchannel();   

filechannel writer = new randomaccessfile(args[1],"rw").getchannel();   

long i = 0;   

long size = read.size()/30;

bytebuffer bb,cc = null;   

while(isize)

bb = read.map(filechannel.mapmode.read_only, i, read.size()-i);

cc = writer.map(filechannel.mapmode.read_write, i, read.size()-i);

cc.put(bb);   

bb.clear();   

cc.clear();   

read.close();   

writer.close();

引數同上。

下邊我列出以下各個大小檔案,各種讀取方式所花費的時間,僅作參考。

**裡邊我會用buffer作為bufferedreader的簡寫,random作為randomaccessfile的簡寫,fileinput作為fileinputstream的簡寫,map作為記憶體直接對映的簡寫。我給出兩次測試結果。

146m檔案

第一次測試

第二次測試

buffer

4.737s

4.581s

random

0.251s

0.249s

fileinput

0.27s

0.269s

map0.102s

0.104s

除了bufferedreader之外,其他的讀取時間基本上沒有太大區別。

356m檔案

第一次測試

第二次測試

buffer

10.889s

10.71s

random

0.558s

0.589s

fileinput

0.637s

0.635s

map0.125s

0.124s

570m檔案

第一次測試

第二次測試

buffer

17.215s

17.393s

random

2.756s

2.243s

fileinput

1.924s

1.975s

map0.203s

0.197s

712m檔案

第一次測試

第二次測試

buffer

21.852s

23.262s

random

3.481s

3.529s

fileinput

3.829s

3.42s

map0.246s

0.258s

998m檔案

第一次測試

第二次測試

buffer

34.08s

32.437s

random

21.817s

20.589s

fileinput

9.669s

9.792s

map15.481s

16.886s

然後我在網上搜了兩種解決方式,但是我自己也沒有實驗出來,**是執行了,但是不知道從**看出他執行前後的區別。這裡也把**放上。

第一種方式:

system.gc();    

system.runfinalization();    

try catch (interruptedexception e)   

第二種方式:

if (buffer == null)    

accesscontroller.doprivileged(new privilegedaction()    

}   

} catch (exception e)    

return null;   

}   

});   

}  

但是執行這個之後,會把時間拖慢,也是乙個問題,所以這個問題待解決。

上邊是我測試了幾個方式的讀取方式,這樣以後實驗室的使用讀取檔案的方式的時候,可以選用最適合的方式,如果時間是最緊要的,那麼可以選用記憶體直接對映,但是這個要保證記憶體夠用,而且檔案合適的情況下,至於上邊的那個問題,下邊我會繼續關注,如果誰了解了,歡迎提示~

如果誰熟悉其他的方式的,歡迎跟帖~

關於最優無限迴圈的考證

昨天在乙個論壇裡看到乙個帖子,是關於無限迴圈的選擇問題,之前也看到過很多次說空for比while 1 效率高的論述,只是之前一直沒有功夫去考證。話不多說,直入正題。brief 示例一 空for int main return 0 brief 示例二 while 1 int main return 0...

java中關於IO檔案讀寫

記住2點就沒問題了。io流只有位元組流,字元流兩種,所以對應的只存在兩種訪問方式 位元組流 讀 fileinputstream 寫 fileoutputstream 字元流 讀 filereader 寫 filewriter 字元流還有一種補充的讀取方式,bufferedreader,而其實是fil...

Qt中提高sqlite的讀寫速度

sqlite資料庫本質上來講就是乙個磁碟上的檔案,所以一切的資料庫操作其實都會轉化為對檔案的操作,而頻繁的檔案操作將會是乙個很好時的過程,會極大地影響資料庫訪問的速度。例如 向資料庫中插入100萬條資料,在預設的情況下如果僅僅是執行query.exec insert into database va...