Java基礎(chǔ)筆記總結(jié)(13)-IO流(1)FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream

IO流

IO流通常用來處理設(shè)備之間的數(shù)據(jù)傳輸

Java對數(shù)據(jù)的操作是通過流的形式

Java用于操作的流的類都在IO包

按照流向:分為輸入流和輸出流

按操作類型:

字節(jié)流:字節(jié)流可以操作任何數(shù)據(jù)离斩,因為計算機(jī)的數(shù)據(jù)都是按照字節(jié)存放

字符流:字符流只能操作純字符數(shù)據(jù),比較方便

字符大 字節(jié)小

常用的父類:

抽象父類:InputStream(字節(jié)輸入流)? OutputStream(字節(jié)輸出流)

抽象父類: Reader(字符輸入流) Writer(字符輸出流)

IO程序書寫

導(dǎo)入IO包類,進(jìn)行IO異常處理,釋放資源

--------------------------------------------------------------------------

FileInputStream

FileInputStream fis = new FileInputStream("xxx.txt");

int x = fis.read();

System.out.println(x);

int y = fis.read();

System.out.println(y);

fis.close();

每read()一次,就向后移動一次并再次讀取

注意,文件的結(jié)束標(biāo)記是-1

while((len = fis.read())!=-1){

System.out.println(len);

}

fis.close();

為什么返回Int而不是Byte

任何文件讀取的結(jié)束都是-1 為了保證讀取過程中不會因為讀到byte的-1而終止讀取過程,因此選擇讀取int來執(zhí)行操作

-----------------------------------------------------------------------------

拷貝圖片哀墓,音樂 逐字節(jié)拷貝特別慢

available()方法 獲取讀取文件的所有字節(jié)個數(shù)(這個方法可能導(dǎo)致內(nèi)存溢出)

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[fis.available()];//創(chuàng)建和文件一樣大小的字節(jié)數(shù)組

fis.read(arr); 將文件上的字節(jié)讀取到文件中(字節(jié)數(shù)組中)

FileOutputStream fos = new FileOutputStream("xxx");

fos.write(arr); 將字節(jié)數(shù)組中的字節(jié)數(shù)據(jù)寫到文件上

----------------------------------------------------------------------------

讀取小數(shù)組的方法

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[1024];

int len = 0;

while((len = fis.read(arr))!=-1)}{

fos.write(arr,0,len);

如果忘記加arr 返回不是讀取的字節(jié)個數(shù),而是字節(jié)的碼表值喷兼,一定要先讀到字節(jié)數(shù)里

-----------------------------------------------------------------------------

BufferInputStream

FileInputStream fis = new FileInputStream("xxx.txt");

FileOutputStream fos = new FileOutputStream("copy.txt");

BufferedInputStream bis = new BufferedInputStream(fis);//創(chuàng)建緩沖區(qū)篮绰,對輸入流進(jìn)行包裝

BufferedOutputStream bos = new BufferedOutputStream(fos);//創(chuàng)建緩沖區(qū),對輸出流進(jìn)行包裝

int b ;

while((b=bis.read())!=-1){

bos.write(b);

}

bis.close();

bos.close();

字節(jié)流一次讀取一個數(shù)組速度要更快

裝飾設(shè)計模式褒搔,提供了字節(jié)緩沖區(qū)流

BuffferedInputStream bis 先在文件讀取8192個數(shù)送到緩沖區(qū)阶牍,然后程序去緩沖區(qū)讀取喷面,如果所有緩沖區(qū)數(shù)據(jù)都被讀完,再去獲取8192個數(shù)據(jù)

BufferedOutputStream bos 程序?qū)?shù)據(jù)送到緩沖區(qū)走孽,然后將緩沖區(qū)寫滿時惧辈,在將數(shù)據(jù)一次性送入到文件中

相比較而言,定義小數(shù)組要比Buffered讀取更快磕瓷,因為其讀和寫都是同一個數(shù)組盒齿,而Buffered操作的是兩個數(shù)組

-----------------------------------------------------------------------------

flush()和close()的區(qū)別

BufferedInputStream bis? = new BufferedInputStream(new FileInputStream());

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream());

如果不加close 拷貝文件會稍微小一點點 close方法具備刷新的功能,關(guān)閉流之前就會刷新一次緩沖區(qū)困食,將緩沖區(qū)的字節(jié)全部刷新到文件上边翁,再關(guān)閉

用bos.flush()直接刷新緩沖區(qū)即可

close和flush相比較, flush刷新完仍然可以繼續(xù)寫入

flush--->實時刷新

--------------------------------------------------------------------------

字節(jié)流讀寫中文(字節(jié)流讀取中文造成亂碼)(GBK中一個字符兩個字節(jié))

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[3]();

int len;

while((len = fis.read())!=-1){

? new String(arr,0,len);

}

fis.close();

而用字節(jié)流寫出中文

FileOutputStream fos = new FileOutputStream("xxx");

fos.write("xxx".getBytes());

fos.write("\r\n".getBytes());//回車換行

fos.close();

--------------------------------------------------------------------------

標(biāo)準(zhǔn)異常處理代碼

TryFinally

JDK 1.6以前

FileInputStream fis = null;

FileOutputStream fos = null;

try{

fis = new FileInputStream("xxx.txt");

fos = new FileOutputStream("xxx.txt");

}catch(Exception e){

e.printStackTrace();

}

finally{

try{

if(fis != null){

fis.close();

}

}finally{

if(fos != null){

fos.close();

}

}

JDK1.7

try(

FileInputStream fis = new FileInputStream("xxx.txt");

FileOutputStream fos = new FileOutputStream("xxx.txt");

){

int b;

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

fos.write(b);

}

}

在try的小括號中書寫類硕盹,必須要實現(xiàn)AutoCloseale接口

------------------------------------------------------

加密用異或操作符匾,一個數(shù)異或兩次等于其本身

拷貝文件

注意如果是自己拷貝文件,/r/n是換行操作符

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘩例,一起剝皮案震驚了整個濱河市啊胶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垛贤,老刑警劉巖焰坪,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異聘惦,居然都是意外死亡某饰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門善绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔漂,“玉大人,你說我怎么就攤上這事涂邀∥练拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵比勉,是天一觀的道長。 經(jīng)常有香客問我驹止,道長浩聋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任臊恋,我火速辦了婚禮衣洁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抖仅。我一直安慰自己坊夫,他們只是感情好砖第,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著环凿,像睡著了一般梧兼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上智听,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天羽杰,我揣著相機(jī)與錄音,去河邊找鬼到推。 笑死考赛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莉测。 我是一名探鬼主播颜骤,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捣卤!你這毒婦竟也來了忍抽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腌零,失蹤者是張志新(化名)和其女友劉穎梯找,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益涧,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡锈锤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闲询。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片久免。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扭弧,靈堂內(nèi)的尸體忽然破棺而出阎姥,到底是詐尸還是另有隱情,我是刑警寧澤鸽捻,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布呼巴,位于F島的核電站,受9級特大地震影響御蒲,放射性物質(zhì)發(fā)生泄漏衣赶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一厚满、第九天 我趴在偏房一處隱蔽的房頂上張望府瞄。 院中可真熱鬧,春花似錦碘箍、人聲如沸遵馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽货邓。三九已至秆撮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逻恐,已是汗流浹背像吻。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留复隆,地道東北人拨匆。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像挽拂,于是被迫代替她去往敵國和親惭每。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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