流:java流是Sun公司專門為文件操作,數據傳輸開發出來的一些類,但是取了個名字叫做流.所有打開的流都必須關閉,因為打開的流是很耗費資源的,并且很不安全.
流中的對象是針對當前操作的程序而言的,輸入是指往程序中導入數據,輸出是指將當前程序中的數據導出到外部
所有的流都實現了Closeable(意思是需要程序員去手動關閉的程序)接口,用于關閉流
所有的輸出流在繼承Closeable的同時也實現了Flushable,用于將緩存的數據強制刷入文件
16個常用流
原始流:(打開連接,讀取數據)
FileInputStream
FileOutputStream
FileReader
FileWriter
包裝流:(在原始的基礎上進行強化)
緩存流,為了加快速度,多次讀,一次寫
BufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
轉換流:將字節流轉換成字符流
InputStreamReader
OutputStreamWriter
格式化輸出流:要對數據輸出前進行排版
PRintWriter
PrintStream:標準輸出流,默認把數據輸出到控制臺
不同平臺(操作系統)之間數據存儲,讀取方式不同,為了彌補這些差異性,形成統一,出現了下面兩種流
DataOutputStream
DataInputStream
序列化:對象是數據封裝的一種方式,并沒有封裝邏輯.對象在當前內存的范疇使用是沒有問題的,但是如果超出了當前內存作用域范疇就需要邏輯,別的地方不一定有當前對象的邏輯,但里面的數據需要用特定的方式讀取,所以我們會把對象對應的邏輯代碼一起創建出來,這就叫對象的序列化
需要這個類實現java.io.Serializable接口
ObjectOutputStream 序列化java對象到硬盤或遠程計算機
ObjectInputStream 將硬盤中的數據反序列化到jvm內存
序列化是通過兩個類把對象中的數據保存到文件中,并不是把整個類復制到文件中,而是把類實例化后的對象中的數據序列化到文件中,原來的類結構文件還必須保存.為了保證序列化前后的類結構文件是一致的,所有實現了Serializable接口的類及其子類都會有一個隱含的成員屬性 serialVersionUID:這個成員變量用于保存jvm生成的一個唯一的編碼,當然,也可以顯式的指定
序列化以后,進行反序列化,必須調用原來的類文件,如果原來的類文件不存在了,反序列化就會報錯,這個時候,我們需要重新生成類文件,但是,如果類的內容改了,重新生成也會失敗,實現了Serializable 接口的類文件的serialVersionUID 都是不同的,這個也已經序列化到了對象文件中,反序列化的時候會比對這個編碼,不一致就會報錯,serialVersionUID 編碼是和內容綁定的,如果數據改了,編號也就變了.但是我們可以自己顯式的指定serialVersionUID來規避這個問題(static final long serialVersionUID = 1L),我們在類原始編碼文件中指定以后,jvm就不會再指定,這樣原始編碼文件,類文件,序列化文件中的編碼就一直相同,即使我們刪除了原始類文件,重新生成一個;甚至我們改變了類文件的內容,也能反序列化成功
常用的方法
所有的流中都有close()方法,流使用完以后關閉流
InputStream和Reader中
read( ) : 從輸入流中讀取數據,根據參數的不同有不同的讀取方式
skip( ) : 跳過和丟棄輸入流中的一些數據
OutputStream和Writer中
write( ) : 將指定的數據讀入到此輸出流中
flush( ) : 將所有緩沖的內容強制刷入此輸出流中
新聞熱點
疑難解答