位元組流 字元流
輸入流 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 答 基礎題...