2.位元組流
|-- inputstream(讀)
|-- outputstream(寫)
由於位元組是二進位制資料,所以位元組流可以操作任何型別的資料,值得注意的是字元流使用的是字元陣列char而位元組流使用的是位元組陣列byte。下面來看乙個位元組流讀寫檔案的簡單例子。
清單7,使用位元組流讀寫文字檔案**
private static void test5()catch(ioexception e)finallycatch(ioexception ex)
}
fileinputstream fis=null;
trycatch(ioexception e)finallycatch(ioexception ex)
}
}
清單8,使用緩衝區對一張進行複製**
private static void test6()
bos.flush();
}catch(ioexception e)finally
if(bis!=null)
}catch(ioexception ex)
}
}
3.轉換流
特點
|--是位元組流和字元流之間的橋梁
|--該流物件可以對讀取到的位元組資料進行指定編碼表的編碼轉換
何時使用
|--當位元組和字元之間有轉換動作時
|--流操作的資料需要進行編碼表的指定時
具體物件體現
|--inputstreamreader:位元組到字元的橋梁
|--outputstreamwriter:字元到位元組的橋梁
說明
這兩個流物件是字元流體系中的成員,它們有轉換的作用,而本身又是字元流,
所以在new的時候需要傳入位元組流物件。
建構函式
|--inputstreamreader(inputstream)
通過該建構函式初始化,使用的是系統預設的編碼表gbk。
|--inputstreamreader(inputstream,string charset)
通過該建構函式初始化,可以通過charset引數指定編碼。
|--outputstreamwriter(outputstream)
使用的是系統預設的編碼表gbk。
|--outputstreamwriter(outputsream,string charset)
通過該建構函式初始化,可以通過引數charset指定編碼。
操作檔案的字元流物件是轉換流的子類
|--reader
|--inputstreamreader**換流)
|--filereader(檔案字元流)
|--writer
|--outputstreamwriter**換流)
|--filewriter(檔案字元流)
說明
轉換流中的read方法,已經融入了編碼表,在底層呼叫位元組流的
read方法時將獲取的乙個或者多個位元組資料進行臨時儲存,並去
查指定的編碼表,如果編碼沒有指定,則使用預設編碼表。
既然轉換流已經完成了編碼轉換的動作,對於直接操作的文本文
件的filereader而言,就不用再重新定義了,只要繼承該轉換
流,獲取其方法,就可以直接操作文字檔案中的字元資料了。
注意
在使用filereader操作文字資料時,該物件使用的是預設的編碼表,
如果要使用指定的編碼表,必須使用轉換流。
**體現
filereader fr=new filereader(「test.txt」);
inputstreamreader isr=new inputstreamreader(new
fileinputstreamreader(「test.txt」));
這兩句**意義相同,操作test.txt中的資料都是使用了系統預設
的編碼gbk。因為我們系統預設使用的編碼表是gbk,如果test.txt中
的資料是通過utf-8形式編碼的,那麼在讀取的時候就需要指定編碼表,
因此轉換流必須使用inputstreamreader isr=new
inputstreamreader(new fileinputstream(「a.txt」),」utf-8」);
四、流操作的基本規律
|--明確資料來源和資料匯(資料目的)
其實是為了明確是輸入流還是輸出流
|--明確操作的資料是否是純文字資料
|--說明
資料來源
鍵盤system.in、硬碟、file開頭的流物件、記憶體(陣列)。
資料匯
控制台system.out、硬碟、file開頭的流物件、記憶體(陣列)。
|--需求
將鍵盤錄入的資料儲存到乙個檔案中和列印到控制台
|--資料來源system.in
既然是源,使用的就是輸入流,可用的體系有inputstream
、reader。因為鍵盤錄入進來的一定是純文字資料,所以
可以使用專門操作字元資料的reader。而system.in對應
的流是位元組讀取流,所以要將其進行轉換,將位元組轉換成字
符即可,所以要使用reader體系中的inputstreamreader,
如果要提高效率,就使用bufferedreader,**如:
bufferedreader bur=new bufferedreader(new
inputstreamreader(sysem.in));
|--資料匯:乙個檔案、硬碟
資料匯一定是輸出流,可以用的體系有outputstream、
writer。往檔案中儲存的都是文字資料,那麼可以使用字元
流較為方便writer。因為操作的是乙個檔案,所以使用writer
中的filewriter,同理,要提高效率就要使用bufferedwriter。
**如:bufferedwriter bufr=new bufferedwriter(new
filewriter(「test.txt」));
清單9,將鍵盤錄入的資料儲存到乙個檔案中和列印到控制台**
private static void test7()
}catch(ioexception e)finally
if(bur!=null)
if(bw!=null)
}catch(ioexception ex)
}
}
清單9是按照預設編碼表寫入文字檔案的,那麼如何按照指定編碼表寫入檔案呢?其實也很簡單,將清單9的**稍微改一下就可以了。
清單10**
private static void test8()
}catch(ioexception e)finally
if(bw!=null)
}catch(ioexception ex)
}
}
既然寫入檔案時指定了編碼,那麼在讀取的時候就必須指定該編碼才能正確顯示。
清單11,讀取指定編碼表的檔案**
private static void test9()
} catch (ioexception e) finally
} catch (ioexception ex)
}
}
寫入和讀取都做了,現在還差個複製操作,其實複製檔案也很簡單,先讀取檔案,再將讀取到的資料寫入檔案,不同的是,在讀取和寫入時我們可以指定編碼表。
清單12**
private static void test11()
} catch (ioexception e) finally
if (bur != null)
} catch (ioexception ex)
}
}
IO流學習總結(下) 轉換流(重要)
參考 大佬的部落格 分為兩種 inputstreamreader 位元組流轉字元流 outputstreamwriter 字元流轉位元組流 寫入資料 記憶體中的字元資料 字元流 outputstreamwriter 位元組流 網路傳輸 或檔案儲存 讀取資料 可以清楚地發現,不管如何操作,最終全部是以...
Java中IO流學習總結
位元組流 可以處理所有以bit為單位儲存的檔案,也就是說可以處理所有的檔案,但是在處理字元上的速度不如字元流 注 其實在各個不同的型別中,輸入流到輸出流的套路基本都一樣。那就拿最簡單的fileoutputstream來舉例子吧 從fileoutputstream到fileintputstream其實...
java學習之IO流2
讀取鍵盤輸入 示例1 下圖中第3行建立位元組讀取流物件,獲取鍵盤讀取流system.in。第4行使用位元組讀取流的read 方法來讀鍵盤資料。第5行進行輸出。private static void readkey1 throws ioexception 示例2 下圖中使用迴圈讀取鍵盤輸入的資料。當鍵...