今日學(xué)習(xí)內(nèi)容總結(jié)
- 緩沖流
- 轉(zhuǎn)換流
- 序列化
- 打印流
緩沖流
緩沖流,也叫高效流,是對4個基本的FileXxx
流的增強(qiáng)池充,所以也是4個流,按照數(shù)據(jù)類型分類:
-
字節(jié)緩沖流:
BufferedInputStream
已慢,BufferedOutputStream
-
字符緩沖流:
BufferedReader
苞尝,BufferedWriter
緩沖流的基本原理,是在創(chuàng)建流對象時访惜,會創(chuàng)建一個內(nèi)置的默認(rèn)大小的緩沖區(qū)數(shù)組嘹履,通過緩沖區(qū)讀寫腻扇,減少系統(tǒng)IO次數(shù),從而提高讀寫的效率砾嫉。
字節(jié)緩沖流
構(gòu)造方法
-
public BufferedInputStream(InputStream in)
:創(chuàng)建一個 新的緩沖輸入流幼苛。 -
public BufferedOutputStream(OutputStream out)
: 創(chuàng)建一個新的緩沖輸出流。
BufferedOutputStream使用步驟
- 創(chuàng)建FileOutputStram對象焕刮,構(gòu)造方法中要綁定要輸出的目的地
- 創(chuàng)建BufferedOutputStream對象舶沿,構(gòu)造方法中傳輸FileOutputStream對象,提高FileOutputStream對象效率
- 使用BufferedOutputStream對象中的方法write配并,把數(shù)據(jù)寫入內(nèi)部緩沖區(qū)中
- 使用BufferedOutputStream對象中的方法flush括荡,把內(nèi)部緩沖區(qū)的數(shù)據(jù)刷新到文件中
- 釋放資源(會自動調(diào)用flush方法)
public static void main(String[] args) throws IOException {
FileOutputStream fos =new FileOutputStream("d:\\z.txt",true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(97);
bos.close();
}
BufferedInputStream使用步驟
- 創(chuàng)建FileInputStream對象,構(gòu)造方法中要綁定要讀取的文件
- 創(chuàng)建BufferedInputStream對象荐绝,構(gòu)造方法中傳輸FileInputStream對象一汽,提高FileInputStream對象的讀取效率
- 使用BufferedInputStream對象中的方法read,讀取文件
- 釋放資源(會自動調(diào)用flush方法)
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\z.txt");
BufferedInputStream bis =new BufferedInputStream(fis);
int read=0;
while((read=bis.read())!=-1){
System.out.println(read);
}
bis.close();
}
字符緩沖流
構(gòu)造方法
-
public BufferedReader(Reader in)
:創(chuàng)建一個 新的緩沖輸入流低滩。 -
public BufferedWriter(Writer out)
: 創(chuàng)建一個新的緩沖輸出流。
特有方法
字符緩沖流的基本方法與普通字符流調(diào)用方式一致岩喷,不再闡述恕沫,我們來看它們具備的特有方法。
- BufferedReader:
public String readLine()
: 讀一行文字纱意。 - BufferedWriter:
public void newLine()
: 寫一行行分隔符,由系統(tǒng)屬性定義符號婶溯。
使用步驟與字節(jié)流類似
寫入數(shù)據(jù):
public static void main(String[] args) throws IOException {
BufferedWriter Bw = new BufferedWriter(new FileWriter("d:\\y.txt"));
for (int i = 0; i <10 ; i++) {
Bw.write("TestBufferedWriter");
Bw.newLine();
}
Bw.close();
}
讀取數(shù)據(jù):
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\y.txt"));
String line;
while ((line=br.readLine())!= null){
System.out.println(line);
}
br.close();
}
轉(zhuǎn)換流
字符編碼和字符集
字符編碼
編碼:字符(能看懂的)--字節(jié)(看不懂的)
解碼:字節(jié)(看不懂的)-->字符(能看懂的)
-
字符編碼
Character Encoding
: 就是一套自然語言的字符與二進(jìn)制數(shù)之間的對應(yīng)規(guī)則。編碼表:生活中文字和計算機(jī)中二進(jìn)制的對應(yīng)規(guī)則
字符集
-
字符集
Charset
:也叫編碼表偷霉。是一個系統(tǒng)支持的所有字符的集合迄委,包括各國家文字、標(biāo)點符號类少、圖形符號叙身、數(shù)字等。
常見字符集有ASCII字符集硫狞、GBK字符集信轿、Unicode字符集等。
OutputStreamWriter類
構(gòu)造方法
-
(OutputStream in)
: 創(chuàng)建一個使用默認(rèn)字符集的字符流残吩。 -
OutputStreamWriter(OutputStream in, String charsetName)
: 創(chuàng)建一個指定字符集的字符流财忽。
使用步驟:
- 創(chuàng)建OutputStreamWriter對象,構(gòu)造方法中傳遞字節(jié)輸出流和指定的編碼表名稱
- 使用OutputStreamWriter對象中的方法write泣侮,把字符轉(zhuǎn)換為字節(jié)存儲在緩沖區(qū)
- 使用OutputStreamWriter對象中的方法flush即彪,把內(nèi)部緩沖區(qū)的數(shù)據(jù)刷新到文件中
- 釋放資源(會自動調(diào)用flush方法)
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\GBK.txt"),"GBK");
osw.write("你好");
osw.close();
}
InputStreamReader類
構(gòu)造方法
-
InputStreamReader(InputStream in)
: 創(chuàng)建一個使用默認(rèn)字符集的字符流。 -
InputStreamReader(InputStream in, String charsetName)
: 創(chuàng)建一個指定字符集的字符流活尊。
使用步驟:
- 創(chuàng)建InputStreamReader對象隶校,構(gòu)造方法中傳遞字節(jié)輸入流和指定的編碼表名稱
- 使用InputStreamReader對象中的方法read讀取文件
- 釋放資源(會自動調(diào)用flush方法)
注意:構(gòu)造方法中指定的編碼表名稱要跟文件的編碼相同琼蚯,否則會發(fā)生亂碼
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\GBK.txt"),"GBK");
int len=0;
while((len=isr.read())!=-1){
System.out.println((char)len);
}
isr.close();
}
將GBK格式轉(zhuǎn)換為UTF-8格式:
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\GBK.txt"),"GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\GBK_u8.txt"),"UTF-8");
int len=0;
while((len=isr.read())!=-1){
osw.write(len);
}
isr.close();
osw.close();
}
序列化
3.1 概述
Java 提供了一種對象序列化的機(jī)制。用一個字節(jié)序列可以表示一個對象惠况,該字節(jié)序列包含該對象的數(shù)據(jù)
遭庶、對象的類型
和對象中存儲的屬性
等信息。字節(jié)序列寫出到文件之后稠屠,相當(dāng)于文件中持久保存了一個對象的信息峦睡。
反之,該字節(jié)序列還可以從文件中讀取回來权埠,重構(gòu)對象榨了,對它進(jìn)行反序列化。對象的數(shù)據(jù)
攘蔽、對象的類型
和對象中存儲的數(shù)據(jù)
信息龙屉,都可以用來在內(nèi)存中創(chuàng)建對象。
3.2 ObjectOutputStream類
ObjectOutputStream類满俗,將Java對象的原始數(shù)據(jù)類型寫出到文件,實現(xiàn)對象的持久存儲转捕。
構(gòu)造方法
-
public ObjectOutputStream(OutputStream out)
: 創(chuàng)建一個指定OutputStream的ObjectOutputStream。
特有方法:
-
public final void writeObject (Object obj)
: 將指定的對象寫出唆垃。
序列化操作
- 一個對象要想序列化五芝,必須滿足兩個條件:
- 該類必須實現(xiàn)
java.io.Serializable
接口,Serializable
是一個標(biāo)記接口辕万,不實現(xiàn)此接口的類將不會使任何狀態(tài)序列化或反序列化枢步,會拋出NotSerializableException
。 - 該類的所有屬性必須是可序列化的渐尿。如果有一個屬性不需要可序列化的醉途,則該屬性必須注明是瞬態(tài)的,使用
transient
關(guān)鍵字修飾砖茸。
public class Person implements Serializable {
private String name;
private int age;
...
}
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:\\person.txt"));
oos.writeObject(new Person("zkn",22));
oos.close();
}
ObjectInputStream類
ObjectInputStream反序列化流隘擎,將之前使用ObjectOutputStream序列化的原始數(shù)據(jù)恢復(fù)為對象。
構(gòu)造方法
-
public ObjectInputStream(InputStream in)
: 創(chuàng)建一個指定InputStream的ObjectInputStream渔彰。
反序列化操作前提
如果能找到一個對象的class文件嵌屎,我們可以進(jìn)行反序列化操作,調(diào)用ObjectInputStream
讀取對象的方法:
-
public final Object readObject ()
: 讀取一個對象恍涂。
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\person.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(o);
}
打印流
java.io.PrintStream
類宝惰,該類能夠方便地打印各種數(shù)據(jù)類型的值,是一種便捷的輸出方式再沧。
PrintStream類
構(gòu)造方法
-
public PrintStream(String fileName)
: 使用指定的文件名創(chuàng)建一個新的打印流尼夺。 -
public PrintStream(OutputStream out)
: 使用指定的字節(jié)輸出流創(chuàng)建一個新的打印流。 -
public PrintStream(File file)
: 輸出的目的地是一個文件
public class PrintDemo {
public static void main(String[] args) throws IOException {
// 調(diào)用系統(tǒng)的打印流,控制臺直接輸出97
System.out.println(97);
// 創(chuàng)建打印流,指定文件的名稱
PrintStream ps = new PrintStream("ps.txt");
// 設(shè)置系統(tǒng)的打印流流向,輸出到ps.txt
System.setOut(ps);
// 調(diào)用系統(tǒng)的打印流,ps.txt中輸出97
System.out.println(97);
}
}