第一章 java 基礎 - 08.IO輸入流與輸出流

無意間都到一篇《走心的安卓工程師跳槽經驗分享》,發現自己工作幾年了,技術方面雖然有了飛躍的進步,可是不知道自己的技術到了什麼地步,每個方面我都涉及到了,但都不深,這大概是初級工程師的詬病吧!
即使知道也不知道從何下手,非常感謝《走心的安卓工程師跳槽經驗分享》的作者!
感興趣的朋友和我一起走下去吧!

08.IO輸入流與輸出流

java的核心庫java.io提供了全面的IO接口。包括:文件讀寫、標準設備輸出等。Java中IO是以流爲基礎進行輸入輸出的,所有數據被串行化寫入輸出流,或者從輸入流讀入。

java.io 的描述
通過數據流、序列化和文件系統提供系統輸入和輸出。


流是一個很形象的概念,當程序需要讀取數據的時候,就會開啓一個通向數據源的流,這個數據源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數據的時候,就會開啓一個通向目的地的流。這時候你就可以想象數據好像在這其中“流”動一樣。

Java流輸入輸出原理
Java把這些不同來源和目標的數據都統一抽象爲數據流。Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的代碼並不是很簡潔,因爲你往往需要包裝許多不同的對象。
在Java類庫中,IO部分的內容是很龐大的,因爲它涉及的領域很廣泛:標準輸入輸出,文件的操作,網絡上的數據流,字符串流,對象流,zip文件流。

Java流的分類
按流向分:
輸入流: 程序可以從中讀取數據的流。
輸出流: 程序能向其中寫入數據的流。
按數據傳輸單位分:
字節流: 以字節爲單位傳輸數據的流
字符流: 以字符爲單位傳輸數據的流
按功能分:
節點流: 用於直接操作目標設備的流
過濾流: 是對一個已存在的流的鏈接和封裝,通過對數據進行處理爲程序提供功能強大、靈活的讀寫功能。

java.io常用類
JDK所提供的所有流類位於java.io包中,都分別繼承自以下四種抽象流類。
InputStream:
繼承自InputStream的流都是用於向程序中輸入數據的,且數據單位都是字節(8位)。
OutputStream:
繼承自OutputStream的流都是程序用於向外輸出數據的,且數據單位都是字節(8位)。
Reader:
繼承自Reader的流都是用於向程序中輸入數據的,且數據單位都是字符(16位)。
Writer:
繼承自Writer的流都是程序用於向外輸出數據的,且數據單位都是字符(16位)。

接口摘要
Closeable
是可以關閉的數據源或目標。
DataInput
接口用於從二進制流中讀取字節,並根據所有 Java 基本類型數據進行重構。
DataOutput
接口用於將數據從任意 Java 基本類型轉換爲一系列字節,並將這些字節寫入二進制流。
Externalizable
實例類的唯一特性是可以被寫入序列化流中,該類負責保存和恢復實例內容。
FileFilter
用於抽象路徑名的過濾器。
FilenameFilter
實現此接口的類實例可用於過濾器文件名。
Flushable
是可刷新數據的目標地。
ObjectInput
擴展 DataInput 接口以包含對象的讀操作。
ObjectInputValidation
允許驗證圖形中對象的回調接口。
ObjectOutput
擴展 DataOutput 接口以包含對象的寫入操作。
ObjectStreamConstants
寫入 Object Serialization Stream 的常量。
Serializable
類通過實現 java.io.Serializable 接口以啓用其序列化功能。

類摘要
BufferedInputStream
爲另一個輸入流添加一些功能,即緩衝輸入以及支持 mark 和 reset 方法的能力。
BufferedOutputStream
該類實現緩衝的輸出流。
BufferedReader
從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。
BufferedWriter
將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。
ByteArrayInputStream
包含一個內部緩衝區,該緩衝區包含從流中讀取的字節。
ByteArrayOutputStream
此類實現了一個輸出流,其中的數據被寫入一個 byte 數組。
CharArrayReader
此類實現一個可用作字符輸入流的字符緩衝區。
CharArrayWriter
此類實現一個可用作 Writer 的字符緩衝區。
Console
此類包含多個方法,可訪問與當前 Java 虛擬機關聯的基於字符的控制檯設備(如果有)。
DataInputStream
數據輸入流允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型。
DataOutputStream
數據輸出流允許應用程序以適當方式將基本 Java 數據類型寫入輸出流中。
File
文件和目錄路徑名的抽象表示形式。
FileDescriptor
文件描述符類的實例用作與基礎機器有關的某種結構的不透明句柄,該結構表示開放文件、開放套接字或者字節的另一個源或接收者。
FileInputStream
從文件系統中的某個文件中獲得輸入字節。
FileOutputStream
文件輸出流是用於將數據寫入 File 或 FileDescriptor 的輸出流。
FilePermission
此類表示對文件和目錄的訪問。
FileReader
用來讀取字符文件的便捷類。
FileWriter
用來寫入字符文件的便捷類。
FilterInputStream
包含其他一些輸入流,它將這些流用作其基本數據源,它可以直接傳輸數據或提供一些額外的功能。
FilterOutputStream
此類是過濾輸出流的所有類的超類。
FilterReader
用於讀取已過濾的字符流的抽象類。
FilterWriter
用於寫入已過濾的字符流的抽象類。
InputStream
此抽象類是表示字節輸入流的所有類的超類。
InputStreamReader
是字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼爲字符。
LineNumberInputStream
已過時。此類錯誤假定字節能充分表示字符。

 /**
     * 獲取輸入字節流 8位
     *
     * @return
     */
    public static void getInputStreamByByte() throws IOException {
        Log.e(TAG, "getInputStreamByByte: 獲取輸入字節流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //輸入目標文件
        File file = new File(path, "config_yt");
        //定義輸入流
        InputStream is = new FileInputStream(file);
        // 進行讀操作
        byte b[] = new byte[1024];
        //讀取長度
        int read = 0;

        int length;
        while ((length = is.read(b)) != -1) {
            //字節裝換成字符輸出
            Log.e(TAG, "getInputStream: 讀取的內容:" + new String(Arrays.copyOf(b, length), "utf-8"));
            read += length;
        }
        //關閉流
        is.close();
        Log.e(TAG, "getInputStream: 讀入數據的長度:" + read);
    }
 /**
     * 獲取輸入字符流 16位
     *
     * @return
     */
    public static void getInputStreamByString() throws IOException {
        Log.e(TAG, "getInputStreamByString: 獲取輸入字符流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //輸入目標文件
        File file = new File(path, "config_yt");
        //定義輸入流
        FileReader reader = new FileReader(file);
        BufferedReader br = new BufferedReader(reader);
        String result;
        while ((result = br.readLine()) != null) {
            Log.e(TAG, "getInputStream: 讀取的內容:" + result);
        }
        //關閉流
        br.close();
        reader.close();
    }
 /**
     * 獲取輸出字節流 8位
     *
     * @return
     */
    public static void getOutStreamByByte() throws IOException {
        Log.e(TAG, "\n\n getOutStreamByByte: 獲取輸出字節流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //輸入目標文件
        File file = new File(path, "config_yt");
        //定義輸入流
        OutputStream out = new FileOutputStream(file, false);//false? 覆蓋:追加
        // 準備一個字符串
        String str = "yancyang";
        // 只能輸出byte數組,所以將字符串變爲byte數組
        byte b[] = str.getBytes("utf-8");
        // 將內容輸出,保存文件
        out.write(b);
        // 關閉輸出流
        out.close();
    }
/**
     * 獲取輸出字符流 16位
     *
     * @return
     */
    public static void getOutStreamByString() throws IOException {
        Log.e(TAG, "getOutStreamByString: 獲取輸出字符流");
        String path = Environment.getExternalStorageDirectory().getPath();
        //輸入目標文件
        File file = new File(path, "config_yt");
        //定義輸入流
        FileWriter fileWriter = new FileWriter(file, true);//true? 追加:覆蓋
        BufferedWriter writer = new BufferedWriter(fileWriter);
        String result = "today is good day!!!!";
        writer.newLine();//開啓新行
        writer.write(result);
        //關閉流
        writer.close();
        fileWriter.close();
    }

Test:

  @Test
    public void testIO() throws Exception {
        Log.e(TAG, "testIO: 1.寫入 yancyang ********************************");
        IO.getOutStreamByByte();
        Log.e(TAG, "testIO: 2.讀取寫入的文件 ********************************");
        IO.getInputStreamByByte();
        Log.e(TAG, "testIO: 3.寫入 today is good day ********************************");
        IO.getOutStreamByString();
        Log.e(TAG, "testIO: 4.讀取寫入的文件********************************");
        IO.getInputStreamByString();
    }

打印結果

testIO: 1.寫入 yancyang ********************************
 getOutStreamByByte: 獲取輸出字節流
testIO: 2.讀取寫入的文件 ********************************
getInputStreamByByte: 獲取輸入字節流
getInputStream: 讀取的內容:yancyang
getInputStream: 讀入數據的長度:8
testIO: 3.寫入 today is good day ********************************
getOutStreamByString: 獲取輸出字符流
testIO: 4.讀取寫入的文件********************************
getInputStreamByString: 獲取輸入字符流
getInputStream: 讀取的內容:yancyang
getInputStream: 讀取的內容:today is good day!!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章