java I/O系統總結

來源:互聯網
上載者:User

標籤:java   io   

參考了Thinking in java I/O部分,發現該書更多是從開發人員原理性角度去描述I/O系統,這樣使得讓初學者不太好懂,後面我參考了“尚學堂”關於這部分視頻講解,感覺比較適合初學,有條理性、容易理解。


首先介紹關於流的概念,流比喻成管道。


上一張圖片很清晰對流進行分類。最簡單方法我們對四個抽象類別在java API中進行查閱具體提供方法。這裡還需要注意區分就是位元組、字元這兩個基本概念不同。

接下來對節點流和處理流兩個概念。


這個就是我認為java I/O比較不方便的,不是直接一個處理而是管道處理還要套上一層管道處理。

接下來看下InputStream 主要的直接子類


這個可以在API中清楚看到。


和InputStream相對應的是OutputStream 也是對稱一些方法和直接子類。



這裡我們稍微關注一下flush()方法,當我們在關閉時,良好編程風格是先flush()再關閉,防止寫中途關閉出現寫不完全現象。





上述是對java I/O系統總體概述,接下來我們看下Java具體的I/O類。

首先介紹 FileInputStream  與 FileOutputStream ,學習這些最簡單寫一些demo 例子程式。

package fileOperations;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestFileInputStream {public static void main(String[] args) {int b = 0;FileInputStream in = null;try{// FileInputStream 多種建構函式方法。//in = new FileInputStream("E:\\workspace2\\Chap-18\\src\\fileOperations\\TestFileInputStream.java");in = new FileInputStream(new File("E:\\workspace2\\Chap-18\\src\\fileOperations\\TestFileInputStream.java"));}catch(IOException e){System.out.println("檔案初始化構造錯誤");System.exit(-1);}try {long num = 0;while((b = in.read())!=-1){System.out.print((char)b);num++;}in.close();System.out.println();System.out.println("共讀取了 "+num+" 個位元組");} catch (IOException e) {System.out.println(" read file error ");System.exit(-1);}}}

程式功能就是讀取程式本身並列印控制台,當你嘗試列印後你會發現一個問題:程式中中文字出來變成了亂碼,還是回到位元組和字元這個概念上,FileInputStream處理的是位元組流,我們每得到一個位元組就轉型到char,但是中文是一個字元 兩個位元組構成,當你列印中文一半時肯定出來亂碼。

下面是利用FileOutputStream寫的檔案拷貝代碼

package fileOperations;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class TestFileOutputStream {public static void main(String[] args) {int b = 0;FileInputStream in = null;FileOutputStream out = null;try {in = new FileInputStream("E:\\workspace2\\Chap-18\\src\\fileOperations\\TestFileInputStream.java");out = new FileOutputStream("D:copy.java");while((b = in.read())!= -1){out.write(b);}in.close();out.close();} catch (FileNotFoundException e) {System.out.println("檔案沒有找到");}catch (IOException e) {System.out.println("檔案複製出錯");}System.out.println("檔案複製完成");}}

這個可以完成對制定檔案複製功能,但是這個不會出現亂碼,讓我有點疑問不知道為什麼。

接下來是FileReader FileWriter 類

package fileOperations;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class TestFileReader {public static void main(String[] args) {FileReader fr = null;int c = 0;try {fr = new FileReader("D:copy.java");while((c = fr.read())!= -1){System.out.print((char)c);}fr.close();} catch (FileNotFoundException e) {System.out.println("找不到檔案");}catch (IOException e) {System.out.println("檔案讀取錯誤");}}}

當用字元類處理時,中文亂碼問題就可以很好解決。

java I/O系統總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.