API-物件流,字元流,子類中轉換流,緩衝流,檔案字元流
物件流:
有的時候,我們可能需要將記憶體中的物件持久化到硬碟上,或者將
硬碟中的物件資訊讀到記憶體中,這個時候我們需要使用物件輸入
輸出流。
序列化: 是物件轉換成一個位元組序列的過程,是一個寫操作
反序列化: 一個位元組序列轉換成物件的過程 ,是一個讀操作
ObjectOutputStream
構造器:
ObjectOutputStream(OutputStream out)
建立一個指定位元組輸出流的物件輸出流物件。
常用方法: 除了提供了一些基本資料型別的寫方法外,還提供了
void writeObject(Object obj)
將記憶體中的物件持久化到硬碟上
ObjectIntputStream
ObjectIntputStream(OutputStream out)
建立一個指定位元組輸入流的物件輸入流物件。
常用方法: 除了提供了一些基本資料型別的讀方法外,還提供了
Object readObject();
從硬碟上讀取一個位元組序列,轉換成物件
Serializable:序列化介面
如果想將物件序列化,那麼物件的型別必須實現此介面。此介面
內什麼都沒有,只是一個序列化標識。
serialVersionUID:
每個能序列化的物件,在被序列化時,系統會預設給此物件的類計算一個
序列化版本號。不同的平臺預設提供的序列化版本號多數情況下不會相同。
因此當我們反序列時,如果硬盤裡儲存的物件的版本號與當前設計的型別
的版本號不一致。會出現執行時異常:
java.io.InvalidClassException,這種情況叫不相容問題。
如果我們想解決不相容問題。我們應該手動提供版本號。儘可能的相同
這樣來解決不相容問題
另外一種情況:
序列化過後,可能會修改型別,如果使用系統預設提供的
版本號,在反序列時,會有異常,如果手動提供,不出現異常
多出來的成員變數,以預設值的形式,賦值給反序列化回來的物件。
transient:成員變數的一個修飾詞,可以理解為瘦身。
有的時候,在序列化物件時,我們不需要將物件的某些成員變數
值持久化到硬碟上(因為不重要),此時,我們可以在這些成員變數
前新增修飾詞transient(儲存時,進行減肥)
================================================
字元流:
在輸出輸入操作時,以字元為單位進行操作,預設是unicode編碼集
字元流的抽象父類分別是
Writer/Reader
Writer提供了字元輸出流的常用方法
void close():關閉
void write(char[] cbuf):寫一個字元陣列
void write(char[] cbuf, int off, int len)
寫一個字元陣列的一部分
write(int c):寫一個字元
write(String str):寫一串字元
write(String str, int off, int len)
寫字串的一部分
Reader提供了字元輸入流的常用方法
int read():讀一個字元,儲存到int的低16位
int read(char[] cbuf):將資料讀進字元陣列中,返回的是讀取的有效字元個數
int read(char[] cbuf, int off, int len)
將字元讀入陣列的一部分。
============================================
子類中轉換流:
OutputStreamWriter:
將字元轉換成位元組寫出到硬碟上
構造器:
OutputStreamWriter(OutputStream out)
建立一個指定位元組輸出流的字元輸出流物件,採用的是系統預設的編碼集
OutputStreamWriter(OutputStream out, Charset cs)
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
OutputStreamWriter(OutputStream out, String charsetName)
建立一個指定位元組輸出流的字元輸出流物件,採用指定編碼集。
write(int a);
當a的低16位,如果被設計成相應的字元時,如果兩個位元組都是
有效位元組,會寫出兩個。如果低16位對應是無效字元,或是有效
位元組只有一位時,會寫一個位元組。
InputStreamReader()
將位元組轉換成字元讀程序序中
構造器:
InputStreamReader(InputStream in)
建立一個使用預設字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
InputStreamReader(InputStream in, CharsetDecoder dec)
InputStreamReader(InputStream in, String charsetName)
建立一個使用指定字符集的InputStreamReader。
====================================================
緩衝流:
PrintWriter:提供了豐富的方法,比BufferedWriter更加常用,此型別提供了
行自動重新整理的功能
構造器:
PrintWriter(File file)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(String fileName)
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush)
上述構造器,有第二個引數的,可以設定為true,表示行自動重新整理。
只有一個引數的構造器,相當有兩個引數時,設定為false的情況,即取消了
行自動重新整理的功能
常用方法:
println()
通過寫入行分隔符字串來終止當前行。
println(boolean x)
列印一個布林值,然後終止該行。
void println(char x)
列印一個字元,然後終止該行。
void println(char[] x)
列印字元陣列,然後終止行。
void println(double x)
列印雙精度浮點數,然後終止行。
void println(float x)
列印一個浮點數,然後終止該行。
void println(int x)
列印一個整數,然後終止該行。
void println(long x)
列印一個長整型,然後終止行。
void println(Object x)
列印一個物件,然後終止該行。
void println(String x)
BufferedReader:提供了一個緩衝區
構造器:
BufferedReader(Reader in)
建立使用預設大小的輸入緩衝區的緩衝字元輸入流。
BufferedReader(Reader in, int sz)
建立使用指定大小的輸入緩衝區的緩衝字元輸入流。
常用方法:
String readLine():
讀一行字串,讀至換行符號為止,返回的資料不包含換行符
當返回值為null時,表示讀至檔案末尾
=====================================
檔案字元流:
FileWriter/FileReader
FileWriter:相當於OutputStreamWriter與
FileOutputStream合起來的功能,內部也維護
了一個緩衝區,但是需要手動flush
構造器:
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
append:表示追加,但是此流不能設定字符集。
常用方法與 OutputStreamWriter的差不多
FileReader:相當於InputStreamReader和FileInputStream合起來的功能
內部也維護了一個緩衝區
構造器:
FileReader(File file)
FileReader(String fileName)
常用方法與InputStreamReader的方法差不多
=============================================
System是一個final修飾的型別
兩個成員變數
out:是PrintStream型別,預設的輸出目的地是控制檯console
in: 是InputStream型別, 預設的資料來源是鍵盤