java學習筆記(基礎篇)—IO流

一:流的概念

在Java中,把一組有序的數據序列稱爲流。java

  • ​ 如a.txt的文件拷貝到b.txt中。

在Java中流是使用統一的方式操做輸入和輸出的數據。數組

  • 從文件中讀取,從鍵盤讀取,從網絡中讀取...
    輸出到文件,發送到網絡....

流就是一個對象。所在的包java.io.*,Java I/O系統負責處理程序的輸入和輸出,java.io包它對各類常見的輸入流和輸出流進行了抽象。微信

二:流的分類

1)根據流操做的方向,參照物:當前程序

​ a)輸入流:將數據讀取到程序中就是輸入流,reader
​ b)輸出流:將程序中的數據寫出到文件中就是輸出流。writer網絡

2)根據類操做的最小數據單元。

​ a)字節類:若是數據流中最小的數據單元是字節,那麼稱這種流爲字節流;字節流處理單元爲 1 個字節,能夠操做字節和字節數組dom

​ b)字符類:若是數據流中最小的數據單元是字符,那麼稱這種流爲字符流。字符流處理的單元爲 2 個字節的 Unicode 字符,能夠操做字符、字符數組或字符串Java內用Unicode 編碼存儲字符,字符流處理類負責將外部的其餘編碼的字符流和java內Unicode 字符流之間的轉換。字符流(一次能夠處理一個緩衝區)一次操做比字節流(一次一個字節)效率高。性能

3)根據流的角色

​ a)節點流,如FileInputStream
​ b)包裝流/處理流,如BufferedInputStream。帶有緩衝區編碼

三:經常使用流

a)java.io.InputStream和java.io.OutputStream

分別表示字節輸入流和字節輸出流,
是全部字節輸入和輸出流的父類.其中的方法參照下面的四線程

b)FileInputStream,FileOutputStream

針對文件進行字節操做。code

c)BufferedOutputStream和BufferInputStream流

帶有緩衝區的流。---調用flush()刷新緩衝流。
加強輸入和輸出流的性能。
提升讀寫的效率。
包裝流是能夠對其餘流進行從新包裝。對象

d)DataInputStream和DataOutputStream.

針對於基本數據類型進行操做

e)ObjectInputStream和ObjectOutputStream

針對於類類型的數據(對象)進行操做。

序列化:將對象保存到文件中或者傳輸到網絡的過程。
反序列化:將文件中或者網絡中將對象讀取到程序的過程。

進行序列化或者反序列化的類必須實現Serializable接口。該接口是一個空接口, 只是起到了標識的做用,標識該對象能夠進行序列化和反序列化serialVersionUID用來代表實現序列化類的不一樣版本間的兼容性。若是你修改了此類, 要修改此值。不然之前用老版本的類序列化的類恢復時會出錯。

transient:該修飾的屬性不會被序列化。是透明的屬性。

f)PipedInputStream,PipedOutputStream

管道輸入,輸出流,
針對線程讀取和寫入數據
connect():管道輸入流鏈接到管道輸出流

g)Reader,Writer抽象類

是全部字符流輸出和輸入的父類。
字符流是在字節流的基礎上進行字符編碼(UTF-8,GBK,GB2312...)

h)InputStreamReader,OutputStreamWriter

一組轉換流--->字節和字符之間的轉換。
InputStreamReader:字節轉換成字符的橋樑
OutputStreamWriter:字符轉換成字節的橋樑

i)BufferedReader,BufferedWriter

帶有緩衝區的字符流。
1)保存hello,您好時指定編碼方式。
取數據時也指定編碼方式。
2)採用這種方式完成文件的拷貝工做。

j)FileReader和FileWriter

針對文件的字符流

k)PrintWriter,PrintStream

都是輸出流,能夠進行格式化輸出
PrintWriter:便可以包裝字符類,也能夠包裝字節流。
PrintStream便可以輸出字符,也能夠輸出字節

l)File對象
m)RandomAccessFile

在文件的任意位置進行讀和寫的操做
seek(long),read(),writer();
當操做大文件的時候使用該類。

四. 字節輸入流和輸出流概述

在java.io包中,java.io.InputStream表示字節輸入流,java.io.OutputStream表示字節輸出流,它們都是抽象類,不能被實例化。

InputStream類提供了一系列和讀取數據有關的方法:
  1. read(): 從輸入流讀取數據:有三種重載形式: 

    a)int read(): 從輸入流讀取一個8位的字節,把它轉換爲0-255之間的整數,並返回這一整數。例如,若是讀到的字節爲9,則返回9,若是讀到
    的字節爲-9,則返回247。若是遇到輸入流的結尾,則返回-1;
    b)int read(byte[] b): 從輸入流讀取若干個字節,把它們保存到參數b指定的字節數組中。返回的整數表示讀取的字節數。若是遇到輸入流的結尾,則返回-1;
    c)int read(byte[] b, int off, int len): 從輸入流讀取若干個字節,把它們保存到參數b指定的字節數組中。 返回的整數表示讀取的字節數。參數off指定在字節數組中開始保存數據的起始下標,參數len指定讀取的字節數目。返回的整數表示實現讀取的字節數。若是遇到輸入流的結尾,則返回-1;以上第一個read方法從輸入流讀取一個字節,而其他兩個read方法從輸入流批量讀取若干字節。在從文件或鍵盤讀數據時,採用後面兩個read方法能夠減小進行物理讀文件或鍵盤的次數,所以能提升I/O操做的效率。

  2. void close(): 關閉輸入流,InputStream類自己的close()方法不執行任何操做。它的一些子類覆蓋了close()方法,在close()方法中釋放和流有關的系統資源。

  3. int available(): 返回能夠從輸入流中讀取的字節數目;

  4. skip(long): 從輸入流中跳過參數n指定數目的字節。

  5. boolean markSupported(),void mark(int),void reset(): 若是要從流中重複讀入數據,先用markSupported()方法來判斷這個流是否支持重複讀入數據,若是返回true,則代表能夠在流上設置標記。接下來調用mark(int readLimit)方法從流的當前位置開始設置標記。最後調用reset()方法,該方法使輸入流從新定位到剛纔作了標記的起始位置。這樣就能夠重複讀取作過標記的數據了。

 OuputStream類提供了一系列和寫數據有關的方法:
  1. write(): 向輸出流寫入數據:有三種重載形式:
    a)void write(int b):向輸出流寫入一個字節;
    b)void write(byte[] b): 把參數b指定的字節數組中的全部字節寫到輸流;
    c)void write(byte[] b, int off, int len): 把參數b指定的字節數組中的全部字節寫到輸出流,參數off指定字節數組的起始下標,從這個位置開始輸出由參數len指定數目的字節; 以上第一個write方法從輸出流寫入一個字節,而其他兩個write方法從輸出流批量寫出若干字節。在向文件或控制檯寫數據時,採用後面兩個write方法能夠減小進行物理讀文件或鍵盤的次數,所以能提升I/O操做的效率。

  2. void close(): 關閉輸出流,OutputStream類自己的close()方法不執行任何操做。它的一些子類覆蓋了close()方法,在close()方法中釋放和流有關的系統資源。

  3. void flush(): OutputStream類自己的flush()方法不執行任何操做,它的一些帶有緩衝區的子類(好比BufferedOutputStream和PrintStream類)覆蓋了flush()方法。經過帶緩衝區的輸出流寫數據時,數據先保存在緩衝區中,積累到必定程度纔會真正寫到輸出流中。緩衝區一般用字節數組實現,其實是指一塊內存空間。flush()方法強制把緩衝區內的數據寫到輸出中。

五:IO操做的步驟

1)選擇合適的流
2)建立流對象
3)進行讀寫的操做
4)關閉資源

關注做者微信公衆號:二維碼

相關文章
相關標籤/搜索