1. 程式人生 > >io流的基礎知識

io流的基礎知識

在這裡插入圖片描述

流的分類;流按照資料流的方向分,可以分為兩種型別,分別是:
 輸入流。從資料來源讀取資料到程式中。只能從中讀取資料,而不能向其寫入資料。
 輸出流。將資料從程式寫入資料目的地。只能從中寫入資料,而不能從中讀取資料。
流按照處理資料的最小單位的不同,可以分為兩種型別,分別是:
 位元組流。位元組流是以byte為最小單位進行資料傳送。io包中的位元組流都繼承自抽象類InputStream或OutputStream。
 字元流。字元流是以char為最小單位進行資料傳送。io包中的字元流都繼承自抽象類Reader或者Writer。
流按照流的功能分,可以分為兩種型別,分別是:
 節點流。節點流是可以直接從/向一個特定的資料來源(例如磁碟檔案、記憶體、網路)讀/寫資料的流。節點流也稱低階流。
 處理流。處理流不直接連線到裝置,而是連線在已存在的流(節點流或處理流)之上,通過對資料的處理為程式提供更強大的讀寫功能。
所有的IO操作都由以下步驟構成:
1) 建立流。根據資料來源和具體的操作(是讀取還是寫入)選擇流,然後建立流。通過 流的建立,建立記憶體到資料來源之間的資料通道,以傳輸資料。
2) 操作流。將資料讀取到記憶體,或將記憶體中的資料寫入資料來源。
3) 關閉流。流操作結束後,釋放所有與該流相關聯的系統資源。

檔案類;
java.io包中的File類提供了管理磁碟檔案和目錄的基本功能。我們可以將一個File物件看成是代表一個檔案或目錄的名稱和位置的字串。File類有四個構造方法:

 public File(String pathname)。建立一個與指定路徑名關聯的File物件。
 public File(String parent, String child)。使用指定引數建立一個File物件。引數parent代表一個目錄,引數child代表在parent中的子目錄或檔案。
 public File(String parent, String child)。使用指定引數建立一個File物件。引數parent代表一個目錄,引數child代表在parent中的子目錄或檔案。
 public File(URI uri)。使用給定的java.net.URI物件建立一個File物件。URI是統一資源識別符號,一個檔案的URI是“file:///目錄/檔名”格式。
File類中常用的方法;
boolean canWrite() 判斷檔案是否可寫
boolean canRead() 判斷檔案是否可讀
boolean createNewFile() 建立一個新檔案
boolean delete() 刪除檔案物件代表的檔案或目錄。刪除目錄時必須保證此目錄為空,否則無法刪除
boolean exists() 判斷檔案或目錄是否存在
String getAbsolutePath() 獲得檔案絕對路徑
boolean isFile() 判斷是否是檔案
boolean isDirectory() 判斷是否是目錄
long lastModified() 獲得檔案最後一次修改時間
long length() 得到檔案長度
String[] list() 返回包含目錄中所含檔案的檔名的字串陣列
File[] listFiles() 返回該目錄中java.io.File物件陣列
boolean mkdir() 建立目錄
更多具體方法可以參考JDK裡面。

位元組流;位元組流用於處理二進位制檔案。所有位元組流都繼承於抽象類InputStream和OutputStream兩個父類。其中InputStream為讀取位元組流的父類,OutputStream為寫入位元組流的父類。
java.io.InputStream類中提供的方法,這些方法提供了管理流的資訊、從流中讀取資料、查明流中有多少可用資料、前進到流中的一個新位置以及關閉流等功能。

int available() ;返回可從該輸入流中讀取的位元組數
void close() ;關閉輸入流,並釋放所有與該流相關聯的系統資源
abstract int read() ;從輸入流讀取下一個位元組。讀取完畢,返回-1
int read(byte[] b); 從輸入流中讀取一些位元組,並將這些位元組存入緩衝陣列b。讀取完畢,返回-1
int read(byte[] b,int off,int len); 從輸入流指定位置off開始讀取資料的前len個位元組,並將其讀入位元組型資料中。讀取完畢,返回-1。
ava.io.OutputStream類中提供的方法,這些方法提供了向流中寫入資料、將流中資料刷入目標並關閉該流的基本功能。
void close() ;關閉輸出流,並釋放所有與該流相關聯的系統資源
void flush() ;重新整理該輸出流,並強制寫出所有緩衝輸出位元組
abstract void write(int b); 將指定位元組寫到該輸出流中
void write(byte[] b); 將指定位元組陣列b中資料寫入該輸出流
void write(byte[] b,int off,int len); 將指定位元組陣列b中資料,從off處開始,寫入len長度位元組到該輸出流中。
低階位元組流
位元組流中的主要低階流,根據其輸入和輸出的裝置或資料來源,分為三類:
 對二進位制檔案進行讀寫操作的FileInputStream和FileOutputStream類,其資料來源是磁碟檔案。
 對記憶體緩衝區中的位元組陣列進行讀寫操作的ByteArrayInputStream和ByteArrayOutputStream類,其資料來源是記憶體中的位元組陣列。
 對執行緒管道進行讀寫操作的PipedInputStream和PipedOutputStream類,其資料來源是執行緒管道。
高階位元組流
高階位元組流對低階位元組流進行了封裝,並有許多功能的擴充套件,包括過濾流類,物件流和合並。
字元流;字元流用於處理文字檔案。所有字元流都繼承於抽象類Reader和Writer兩個父類。其中Reader為讀取字元流的父類, Writer為寫入字元流的父類。
字元流包括低階和高階倆種,其中高階裡還包括了緩衝流,轉換流和列印輸出流。

流的使用原則;

一、按資料來源分類

  1. 如果資料來源是檔案,對於位元組流,使用FileInputStream和FileOutputStream;對於字元流,使用FileReader和 FileWriter。
  2. 如果資料來源是位元組陣列byte[],則使用ByteArrayInputStream和ByteArrayOutputStream。
  3. 如果資料來源是字元陣列Char[],則使用CharArrayReader和CharArrayWriter。
  4. 如果資料來源是String物件,對於位元組流,則使用StringBufferInputStream和StringBufferOuputStream;對於字元流,則使用StringReader和StringWriter。
  5. 如果資料來源是網路資料流,對於位元組流,使用InputStream和OutputStream;對於字元流,使用Reader和Writer。
    二、按是否格式化輸出分:要格式化輸出,則使用PrintStream或PrintWriter。
    三、按是否要緩衝分,要緩衝的話,對於位元組流使用BufferedInputStream和BufferedOutputStream;對於位元組流,使用BufferedReader和BufferedWriter。
    四、按資料格式分
  6. 二進位制格式(只要不能確定是純文字的):使用InputStream、OutputStream 及其所有帶 Stream結束的子類。
  7. 純文字格式(含純英文與漢字或其他編碼方式):使用Reader、Writer 及其所有帶 Reader、Writer 的子類。
    五、按輸入輸出分
  8. 輸入:使用Reader、InputStream 型別的子類。
  9. 輸出:使用Writer、OutputStream 型別的子類。
    六、特殊需要。
    在不考慮特殊需求的情況,決定使用哪個類以及它的構造程序的一般準則如下:
    首先,考慮最原始的資料格式是什麼:原則四。
    第二,是輸入還是輸出:原則五。
    第三,是否需要轉換流:原則六第1點。
    第四,資料來源是什麼:原則一。
    第五,是否要緩衝:原則三(特別註明:一定要注意的是readLine()是否有定義,有什麼比 read()、write()更特殊的輸入或輸出方法)。
    第六,是否要格式化輸出:原則二