每日一問 使用IO流進行檔案複製

2021-08-18 18:41:18 字數 3083 閱讀 6230

位元組流    字元流

輸入流 inputstream  reader read()

輸出流 outputstream writer write()

對上面名詞的解釋

位元組流:一次讀1個位元組,1個位元組=8個二進位制位

字元流:一次讀1個字元,1個字元=2個位元組=乙個char型別字元

『a 『、』中』、』?』

列舉你知道的流

fileinputstream/fileoutputstream

filereader/filewriter

bufferedinputstream/bufferedoutputstream

bufferedreader/bufferedwriter

inputstreamreader/outputstreamwriter

printwriter……

bufferedreader讀一行的資料:string readline();

printwriter寫一行的資料:println(string);

public

static

void

main(string args)

} catch (filenotfoundexception e) catch (ioexception e) finally catch (ioexception e)

}if(fos != null) catch (ioexception e) }}

}

這種方式可以複製任何型別的檔案,位元組流只能處理ascii(可以簡單理解為鍵盤直接敲出來的,不依賴任何輸入法的)

而字元流是不靠譜的,不能用字元流複製檔案,字元流可以處理帶中文或非ascii的檔案

舉個例子

『中』字是1個字元,對應2個位元組,也就是16個二進位制位,比如0100 1110 0010 1101

位元組流一次讀1個位元組,所以它把中這個字拆開來讀了

現在我們複製乙個大一點的檔案,在剛才的**上加上

long start = system.currenttimemillis();

//1、確定原始檔的路徑

string srcfilepath =

"d:/yasea-master.zip";

//2、確定目標檔案路徑

string destfilepath =

"d:/yasea-master-copy.zip";

......

long end = system.currenttimemillis();

system.out.println("耗時:"

+(end-start));

執行程式

開始檔案大小對比,在程式執行中,被copy檔案一直是0kb

執行結束時,輸出日誌

耗時:54667
直到flush之後才有大小

可以看到1個9m的檔案複製了50多秒,效率很低,我們來進行改進

改為用bufferedinputstream和bufferedoutputstream

public

static

void

main(string args)

} catch (filenotfoundexception e) catch (ioexception e) finally catch (ioexception e)

}if(bos != null) catch (ioexception e) }}

long end = system.currenttimemillis();

system.out.println("耗時:"+(end-start));

}

複製完成,輸出日誌

耗時:28082
我們將資料讀入緩衝區

public

static

void

main(string args) */

//讀的時候會讀入緩衝區的陣列

byte b = new

byte[1024];

int length;

while((length = fis.read(b))!=-1)

} catch (filenotfoundexception e) catch (ioexception e) finally catch (ioexception e)

}if(fos != null) catch (ioexception e) }}

long end = system.currenttimemillis();

system.out.println("耗時:"+(end-start));}}

執行完成,檢視日誌

耗時:79
這種做法是犧牲空間換取時間,是划算的

關於緩衝區,有2點要說

1、檔案越大,給的緩衝區越大

2、緩衝區大到一定程度,效果就不明顯,推薦1024*8

剛才的程式可能有bug

例如乙個檔案2000byte,我們的緩衝區設為1024

第一次讀取的時候讀了1024,第二次只能讀976,但是我們write的時候還是1024,所以檔案大小可能會不對

所以最後一點要改進的就是

//讀的時候會讀入緩衝區的陣列

byte b = new

byte[1024];

int length;

while((length = fis.read(b))!=-1)

每日一問2019 09 26

遍歷物件的方法 有4種。1 for in 2 object.keys foreach3 object.getownpropertynames foreach4 reflect.ownkeys foreach 遍歷物件的方法解析 for in for of區別 for in 遍歷的是鍵名 適合遍歷物件...

Android每日一問系列

1 recyclerview的快取機制?和listview最大的區別?2 multidex需要做什麼優化?如果開啟了multidex 主dex依然爆掉,怎麼處理?3 intent最大傳遞資料?超出限制後如何傳遞?4 databinding的原理?5 android 程序間如何高效傳遞大資料塊?大資料...

Python 每日一問 37

問 基礎題 設計乙個複利計算函式invest 它包含三個引數 amount 資金 rate 年利率 time 投資時間 鍵盤輸入每個引數後,輸出結果 返回每一年的資金總額 比如,amount 10000 rate 8 time 5提高題 請實現乙個函式,將乙個字串中的每個空格替換成 20 答 基礎題...