當前位置:萬佳範文網 >

工作總結 >學習總結 >

java io流學習總結

java io流學習總結

一、什麼是流?

java io流學習總結

流就是字節序列的抽象概念,能被連續讀取數據的數據源和能被連續寫入數據的接收端就是流,流機制是Java及C++中的一個重要機制,通過流我們可以自由地控制文件、內存、IO設備等數據的流向。而IO流就是用於處理設備上的數據,如:硬盤、內存、鍵盤錄入等。IO流根據處理類型的不同可分為字節流和字符流,根據流向的不同可分為輸入流和輸出流。

二、字節流和字符流的區別:

字符流,因為文件編碼的不同,就有了對字符進行高效操作的字符流對象,它的原理就是基於字節流讀取字節時去查了指定的碼錶。它和字節流的區別有兩點:1.在讀取數據的時候,字節流讀到一個字節就返回一個字節,字符流使用了字節流讀到一個或多個字節(一箇中文對應的字節數是兩個,在UTF-8碼錶中是3個字節)時,先去查指定的編碼表,再將查到的字符返回;2.字節流可以處理所有類型的數據,如jpg、avi、mp3、wav等等,而字符流只能處理字符數據。所以可以根據處理的文件不同考慮使用字節流還是字符流,如果是純文本數據可以優先考慮字符流,否則使用字節流。

三、IO體系,所具備的基本功能就是讀和寫:

1.字符流

|-- Reader(讀)

|-- Writer(寫)

Reader

|--InputStreamReader

|--FileReader:用於處理文件的字符讀取流對象

Writer

|--OutputStreamWriter

|--FileWriter:用於處理文件的字符寫入流對象

其實很容易就可以看出來,IO體系中的子類名後綴絕大部分是父類名稱,而前綴則是體現子類特有功能的名稱。

Reader中常見的方法:

|--int read

讀取一個字符,並返回讀到的這個字符,讀到流的末尾則返回-1。

|--int read(char)

將讀到的字符存入指定的數組中,返回的是讀到的字符個數,

讀到流的末尾則返回-1。

|--close

讀取字符其實用的是window系統的功能,就希望使用完畢後,

進行資源的釋放。

FileReader除了自己的構造函數外沒有特有的方法:

|--用於讀取文本文件的流對象。

|--用於關聯文本文件。

|--構造函數FileReader(String fileName)

在讀取流對象初始化時,必須要指定一個被讀取的文件,

如果該文件不存在則會發生FileNotFoundException異常。

Writer中常見的方法:

|--write

將一個字符寫入到流中。

|--write(char)

將一個字符數組寫入到流中。

|--writer(String)

將一個字符寫入到流中。

|--flush

刷新流,將流中的數據刷新到目的地中,流還存在。

|--close

關閉資源,在關閉錢會先調用flush, 刷新流中的數據到目的地。

FileWriter,除了自己的構造函數外沒有特有的方法:

|--該類的特點

|--用於處理文本文件

|--沒有默認的編碼表

|--有臨時緩衝

|--構造函數,在寫入流對象初始化時,必須要有一個存儲數據的目的地。

|--FileWriter(String fileName),該構造器是幹什麼用的呢?

|--調用系統資源

|--在指定位置創建一個文件,如果該文件已經存在則被覆蓋。

|--FileWriter(String filename,Boolean append),這構造器的作用是?

當傳入的boolean類型的值為true時,會在指定文件末尾處進行數據的續寫。

清單1,將文本數據保存到文件中代碼

private static void test1{

FileWriter fw=null;

try {

//初始化FileWriter對象,指定文件名已經存儲路徑

fw=new FileWriter("D:/");

e("將字符串寫入流");

//將流中的數據刷新到目的地,流還在

h;

e("將字符串寫入流");

} catch (IOException e) {

tStackTrace;

}finally{

if(fw!=null){

try {

e;

} catch (IOException e1) {

tStackTrace;

}

}

}

}

清單2,讀取一個已有文本文件,並將文本內容打印出來代碼

private static void test2{

FileReader fr=null;

try {

//初始化FileReader對象,指定文件路徑

fr=new FileReader("D:/");

int ch=0;

while((ch=)!=-1){

//每次讀取一個字符,直到讀到末尾-1為止

tln((char)ch);

}

} catch (IOException e) {

tStackTrace;

}finally{

if(fr!=null){

try {

e;

} catch (IOException e1) {

tStackTrace;

}

}

}

}

這樣每讀到一個字符就打印出來,效率很不高,能不能按指定大小讀取完後再打印出來呢?答案是當然可以的。

清單3,讀取一個已有文本文件,讀完1kb再將其讀到的內容打印出來代碼

private static void test3{

FileReader fr=null;

try {

//初始化FileReader對象,指定文件路徑

fr=new FileReader("D:/");

char buf=new char[1024];

int len=0;

while((len=(buf))!=-1){

//每次讀取1kb大小的字符,直到讀到末尾-1為止

tln(new String(buf,0,len));

}

} catch (IOException e) {

tStackTrace;

}finally{

if(fr!=null){

try {

e;

} catch (IOException e1) {

tStackTrace;

}

}

}

}

字符流的緩衝區:

|--緩衝區的出現提高了對流的操作效率。

原理:其實就是將數組進行封裝。

|--對應的對象

|--BufferedWriter

特有方法newLine,跨平台的換行符。

|--BufferedReader

特有方法readLine,一次讀一行,到行標記時,將行標記

之前的字符數據作為字符串返回,讀到末尾返回null。

|--説明

在使用緩衝區對象時,要明確,緩衝的存在是為了增強流

的功能而存在,所以在建立緩衝區對象時,要先有流對象

存在。其實緩衝區內部就是在使用流對象的方法,只不過

加入了數組對數據進行了臨時存儲,為了提高操作數據的

效率。

|--代碼上的體現

|--寫入緩衝區對象

根據前面所説的建立緩衝區時要先有流對象,並將其作為參數傳遞給緩衝區的構造函數

BufferedWriter bufw=new BufferedWriter(new FileWriter(“”));

e(“將數據寫入緩衝區”);

h;//將緩衝區的數據刷新到目的地

e;//其實關閉的是被包裝在內部的流對象

|--讀取緩衝區對象

BufferedReader bufr=new BufferedReader(new FileReader(“”));

String line=null;

while((line=Line)!=null){

//每次讀取一行,取出的數據不包含回車符

tln(line);

}

e;

清單4,使用緩衝區對文本文件進行拷貝代碼

private static void test4{

BufferedReader bufr=null;

BufferedWriter bufw=null;

try {

bufr=new BufferedReader(new FileReader("D:/"));

bufw=new BufferedWriter(new FileWriter("D:/"));

String line=null;

while((line=Line)!=null){

e(line);//每次將一行寫入緩衝區

h;//刷新到目的地

}

} catch (IOException e) {

tStackTrace;

}finally{

try {

if(bufw!=null){

e;

}

if(bufr!=null){

e;

}

} catch (IOException e1) {

tStackTrace;

}

}

}

仔細看可以發現,程序裏面的FileReader對象和FileWriter對象直接new出來且沒有調用close,因為緩衝對象調用了這兩個方法,前面説了,緩衝對象調用的flush和close其實就是關閉被包裝在其內部的流對象。關閉流的先後順序也要注意,如果流之間有依賴關係,則被依賴的流要後關閉。readLine方法原理:其實緩衝區中的該方法,用的還是與緩衝區關聯的流對象的read方法,只不過,每一次讀到一個字符先不進行具體操作,先進行臨時存儲,當讀到回車標記時,將臨時容器中存儲的數據一次性返回。我們可以根據這個原理來自己編寫一個緩衝區對象。

清單5,編寫一個自己的bufferedreader代碼

public class MyBufferedReader {

private Reader reader;

public MyBufferedReader(Reader reader){

er=reader;

}

public String readLine throws IOException{

StringBuilder sb=new StringBuilder;

int ch=0;

while((ch=)!=-1){

if(ch=='r'){//空格則繼續

continue;

}else if(ch=='n'){//每次返回一行

return ring;

}else{

nd((char)ch);

}

}

return ring;

}

public void close throws IOException{

//緩衝對象的關閉方法其實就是調用流本身的close

e;

}

}

測試時把清單4的BufferedReader對象替換成MyBufferedReader對象即可。

清單6,測試mybufferedreader代碼

private static void test4{

MyBufferedReader bufr=null;

BufferedWriter bufw=null;

try {

bufr=new MyBufferedReader(new FileReader("D:/"));

bufw=new BufferedWriter(new FileWriter("D:/"));

String line=null;

while((line=Line)!=null){

e(line);//每次將一行寫入緩衝區

h;//刷新到目的地

}

} catch (IOException e) {

tStackTrace;

}finally{

try {

if(bufw!=null){

e;

}

if(bufr!=null){

e;

}

} catch (IOException e1) {

tStackTrace;

}

}

}

其實我們自己寫的這個緩存對象就是對Reader對象進行了功能的增強,Reader對象每次只能返回一個字符,而增強了功能之後該類就可以每次返回一行字符,也就是設計模式中所説的裝飾模式。

標籤: java io 學習
  • 文章版權屬於文章作者所有,轉載請註明 https://wjfww.com/zh-mo/zongjie/xuexi/8kq3gl.html
專題