I O各類文件流的特性詳解 & 關聯關係解析

I/O流之 各類流的特性及使用解析

一、I/O的文件和文件流體系總覽

(一)File類

1、對文件的解析描述

【引入】

<1>程序中的數據都是 存儲在內存中, 集合、數組、變量 ,缺點:程序一關,數據丟失

永久性存儲數據:

1、數據存到文件(磁盤)

2、數據存儲在數據庫
……

2、File類的常見方法

<1>、特點:

程序中一個File實例對應 磁盤中的一個文件或目錄

<2>、創建對象三種方式如下:

File file =new File(文件或目錄的路徑名);

File file =new File(父級目錄,子級名);

1> File file = new File("src/stu.txt");
2> File file = new File(File parent,String  child);
3> Filefile=new File(String parent,String child);

<3>、常用方法:

    獲取文件本身信息
        getName
        getParent
        getPath
        getAbsolutePath
        length

    判斷文件信息
        isFile
        isDirectory
        exists
        isHidden

    創建、刪除、重命名
        創建一級目錄mkdir
        創建多級目錄mkdirs
        立即刪除 delete
        程序退出刪除 deleteOnExit
        重命名 rename
        list 列出當前目錄下 的子級目錄或文件,返回類型String[]
        listFiles列出當前目錄下的字節目錄或文件,返回類型File[]

    重寫Object類的方法
        equals
        toString

3、使用舉例(見I/O流使用代碼實踐示例)

    1.先判斷有沒有此目錄,如有刪除,沒有創建,並在裏面創建文件,然後獲取文件信息
    2.列出 指定目錄下 的所有的子級目錄或文件名

(三)、I/O文件流

<1>相關概念:

IO:
    Input/Output 輸入輸出

流:
    數據 在程序 和 節點之間的傳輸

節點:

    源節點
        文件、網絡、鍵盤
    目標節點
        文件、網絡、控制檯

輸入:
    數據 從源節點到 程序

輸出:
    數據從程序到目標節點

<2>分類

按傳輸方向不同:
  <1>輸入流
  <2>輸出流

按傳輸單位不同

    字節流
    字符流
按流的功能不同
    基礎流
    包裝流(增強流/過濾流)

按傳輸單位不同
   字節流
   字符流

按流的功能不同
   基礎流
   包裝流(增強流/過濾流)

《二》框架體系:

(一)各種常見流的框架示例

<1>InputStream字節輸入流

     FileInputStream文件字節輸入流
        創建對象:
            通過構造,指向一個文件或路徑

        方法:
            read
            close

     BufferedInputStream字節緩衝流
        創建對象:
            通過構造,指向一個InputStream對象

        方法:
            read
            close

     ObjectInputStream反序列化流
        創建對象:
            通過構造,指向一個InputStream對象

        方法:
            readXX()
                讀取基本類型
            readObject()
                讀取對象
            close()

  <2>OutputStream字節輸出流

    FileOutputStream文件字節輸出流
        創建對象:
            通過構造,指向一個文件或路徑,還可以設置一個boolean值,代表是否追加內容

        方法:
            write(char)
            write(byte[])
            write(byte[],int offset,int len)
            close()

    BufferedOutputStream 字節緩衝流
        創建對象:
            通過構造,指向一個OutputStream對象

        方法:
            write(char)
            write(byte[])
            write(byte[],int offset,int len)
            close()

    ObjectOutputStream序列化流
        創建對象:
            通過構造,指向一個OutputStream對象

        方法:
            writerXX
                寫入基本類型
            writeObject
                寫對象
            close()

<3>Reader字符讀取流

    FileReader文件字符讀取流
        同 FileInputStream的使用,只是 byte換成了 char

    BufferedReader字符緩衝流
        同BufferedInputStream的使用
        多出來的方法
            readLine

<4>Writer字符寫入流

    FileWriter文件字符寫入流
        同 FileOutputStream的使用,只是 byte換成了char
        多出來的方法
            write(string)
            write(string,int offset,int len)

    BufferedWriter字符緩衝流
        同BufferedOutputStream的使用
        多出來的方法
            newLine()

<5>其他小流

    ①標準輸入、輸出
        System.in標準輸入,類型: InputStream
        System.out標準輸出,類型 :PrintStream
        System.err 標準錯誤,類型:PrintStream

        重定向
            System.setIn();
            System.setOut();
            System.setErr();

    ②打印流
        1.打印流 只有 PrintStream和PrintWriter
        2.只有輸出,沒有輸入
        3.裏面提供了一系列 打印方法print、println、printf方法,而且可以直接打印基本數據類型
        4.永遠不會拋出異常,除了 構造方法
        5.有自動刷新功能,但是必須 在換行結束後 纔有

    ③轉換流
        1.轉換流只有 InputStreamReader和OutputStreamWriter
        2.將字節流轉換成字符流,如果讀寫的文件中只有字符,用轉換流轉換後效率會高一些

    ④數據流
        1、數據流 只有 DataOutputStream和DataInputStream
        2、數據流和對象流  都實現了  同樣的接口,DataInput和DataOutput,都 具備讀寫基本類型的方法
        3、讀寫順序要一致

    ⑤隨機訪問流
        1、只有一個 RandomAccessFile
        2、既可以讀,又可以寫
        3、自帶指針,每次讀寫,指針自動後移指定讀寫數據的字節數
        4、可以通過 seek方法,自由移動指針,也可以通過getFilePointer獲取指針位置

    ⑥字節數組流
        ByteArrayOutputStream和ByteArrayInputStream
        特點:可以直接使用 toByteArray() 和 toString() 獲取數據。 

(二)使用步驟

1、創建流對象(選擇哪個流)
2、調用讀取或寫入
3、關閉流

四、IO流的幾種不同流類如下:

字節輸入流
InputStream
    FileInputStream 文件字節輸入流
    BufferedInputStream 字節緩衝輸入流(增強流)
    ObjectInputStream 對象輸入流
    DataInputStream   數據輸入流


字節輸出流
OutputStream
    FileOutputStream 文件字節輸出流
    BufferedOutputStream 字節緩衝輸出流(增強流)
    ObjectOutputStream 對象輸出流
    DataOutputStream   數據輸出流


字符讀取流(輸入流)
Reader
    FileReader
    BufferedReader
    InputStreamReader


字符寫入流(輸出流)
Writer
    FileWriter
    BufferedWriter
    OutputStreamWriter

瞭解:

PrintStream,PrintWriter

RandomAccessFile 隨機訪問流

FileInputStream和FileOutputStream

文件字節流

(1)、FileInputStream 文件字節輸入流

創建對象:

FileInputStream fis = new FileInputStream(string path);

FileInputStream fis = new FileInputStream(new File(path));

方法:

read() 讀取單個字節,返回該字節的 整數形式,,如果到文件末尾返回-1

read(byte[] ) 讀取 多個字節到數組中,返回讀取的長度,如果到文件末尾返回-1

read(byte[] ,int offset,int len) 讀取 多個字節到 指定範圍的數組中,返回讀取的長度,如果到文件末尾返回-1

close 關閉流

(2)、FileOutputStream 文件字節輸出流

創建對象:

FileOutputStream fos = new FileOutputStream(string path);

FileOutputStream fos = new FileOutputStream(string path,boolean f);


FileOutputStream fos = new FileOutputStream(File path);

FileOutputStream fos = new FileOutputStream(File path,boolean f);

方法:

write(char) 寫入單個字節

write(byte[]) 寫入整個字節數組

write(byte[],int offset,int len) 寫入 字節數組的一部分


close 關閉流

其它相關的API:

String str = new String(byte[]); 將字節數組轉換成字符串
String str = new String(byte[],int offset,int len); 將字節數組的一部分轉換成字符串

String str = new String(char[]); 將字符數組轉換成字符串
String str = new String(char[],int offset,int len); 將字符數組的一部分轉換成字符串



字符串.getBytes()              將字符串轉換成byte[]

字符串.toCharArray()               將字符串轉換成char[]

(3)、緩衝流

功能:提高 被包裝流類的 效率

1.BufferedInputStream
用於增強 InputStream派系的類

構造: 參數爲InputStream
方法: 同FileInputStream

2.BufferedOutputStream
用於增強 OutputStream派系的類

構造: 參數爲OutputputStream
方法: 同FileOutputStream

3.BufferedReader

用於增強 Reader派系的類

構造: 參數爲Reader
方法: 多了  readLine

4.BufferedWriter

用於增強 Writer派系的類


構造: 參數爲Writer
方法: 多了  newLine

(4)對象流

屬於包裝流,包裝 字節輸入流和字節輸出流

功能:讀寫基本數據類型 和對象類型

特點:

ObjectOutputStream : 對象寫入流(序列化流)

writeObject:序列化對象的方法


ObjectInputStream:對象讀取流(反序列化流)

readObject:反序列化對象的方法

序列化:

對象 持久化到 磁盤文件或網絡,保證  存儲和讀取 的對象是同一個

反序列化:

將磁盤文件或網絡中的對象 讀取到內存,保證  存儲和讀取 的對象是同一個

1、ObjectOutputStream

構造:

參數:  OutputStream

方法:

writeInt
writeChar
writeDouble

writeUTF


writeObject

2、ObjectInputStream

構造:

參數:  InputStream

方法:

readInt
readChar
readDouble

readUTF
readObject

注意:

1、 讀寫 順序要一致!!!

2、  讀寫的對象要實現序列化接口

    Serializable

(5)、標準輸入輸出流

System.in 類型 爲 InputStream
System.out 類型 爲 PrintStream
System.err類型爲PrintStream


重定向輸入輸出:

System.setIn();
System.setOut();
System.setErr();

(6)、打印流

 * 1、  提供了非常便利的  print、println、printf方法,可以直接打印 各種類型 的字符串形式
 * 
 * 2、 調用打印或寫入方法時,不會拋出IOException,  (構造方法除外)
 * 
 * 3、 打印流有自動刷新功能,但是必須 在 換行標記之後
 * 
 * 4、直接可以應用在標準輸出流中
 * 
 * System.out 的類型 就是 PrintStream
 * 
 * System.out得到一個PrintStream對象,可以直接調用 裏面的一系列方法
 * 
 * 5、沒有輸入,只有輸出
 * 
 * 打印流:PrintStream和PrintWriter
 * 
 * 
 * 6、可以在構造方法 中指定編碼格式

7、轉換流

1、功能:轉換流提供了在字節流和字符流之間的轉換

2、InputStreamReader和OutputStreamWriter

3、好處:字節流中的數據都是字符時,轉成字符流操作更高效。
   還可以使用字符流的一些特有的方法

8、隨機訪問流

1、既可以讀,又可以寫

2、自帶指針,可以自由移動指針 ,通過 seek方法,設置讀寫 指定位置的 數據,正向反向皆可
 * 
3、默認 的,最開始 指針是在文件頭,每調用一次read/write,按讀取/寫入的字節 ,指針往前移動

9、數據流
數據流:DataInputStream和DataOutputStream

 * 可以 讀寫 基本數據類型和 String
 * 
 * 注意讀寫順序一致
 * 和對象流 一樣都實現了DataInput和Output

五、字符編碼

1、常見的編碼表

ASCII:美國標準信息交換碼。0-255
用一個字節的7位可以表示。
ISO8859-1:拉丁碼錶。歐洲碼錶  。比較適合處理英文
用一個字節的8位表示。
GB2312:中國的中文編碼表。 Gbk>gb2312
GBK:中國的中文編碼表升級,融合了更多的中文文字符號。
Unicode:國際標準碼,融合了多種文字。 固定長度的編碼
所有文字都用兩個字節來表示,Java語言使用的就是unicode
UTF-8:最多用三個字節來表示一個字符。

2、關於亂碼

解碼和編碼時 使用的編碼表不一致造成的!!
或

讀寫數據時 使用的編碼表不一致造成的!!
解決:

讀和寫的時候 ,要統一編碼
★★★★★

1、按 指定的字符集格式,將字符串(編碼)轉換成字節數組
    //str.getBytes(“字符集”);

2、按指定的字符集格式,將 字節數組(解碼)轉換成 字符串
    //String str = new String(byte[],"字符集");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章