Java學(xué)習(xí)Day18

今日學(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使用步驟

  1. 創(chuàng)建FileOutputStram對象焕刮,構(gòu)造方法中要綁定要輸出的目的地
  2. 創(chuàng)建BufferedOutputStream對象舶沿,構(gòu)造方法中傳輸FileOutputStream對象,提高FileOutputStream對象效率
  3. 使用BufferedOutputStream對象中的方法write配并,把數(shù)據(jù)寫入內(nèi)部緩沖區(qū)中
  4. 使用BufferedOutputStream對象中的方法flush括荡,把內(nèi)部緩沖區(qū)的數(shù)據(jù)刷新到文件中
  5. 釋放資源(會自動調(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使用步驟

  1. 創(chuàng)建FileInputStream對象,構(gòu)造方法中要綁定要讀取的文件
  2. 創(chuàng)建BufferedInputStream對象荐绝,構(gòu)造方法中傳輸FileInputStream對象一汽,提高FileInputStream對象的讀取效率
  3. 使用BufferedInputStream對象中的方法read,讀取文件
  4. 釋放資源(會自動調(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)建一個指定字符集的字符流财忽。

使用步驟:

  1. 創(chuàng)建OutputStreamWriter對象,構(gòu)造方法中傳遞字節(jié)輸出流和指定的編碼表名稱
  2. 使用OutputStreamWriter對象中的方法write泣侮,把字符轉(zhuǎn)換為字節(jié)存儲在緩沖區(qū)
  3. 使用OutputStreamWriter對象中的方法flush即彪,把內(nèi)部緩沖區(qū)的數(shù)據(jù)刷新到文件中
  4. 釋放資源(會自動調(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)建一個指定字符集的字符流活尊。

使用步驟:

  1. 創(chuàng)建InputStreamReader對象隶校,構(gòu)造方法中傳遞字節(jié)輸入流和指定的編碼表名稱
  2. 使用InputStreamReader對象中的方法read讀取文件
  3. 釋放資源(會自動調(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) : 將指定的對象寫出唆垃。

序列化操作

  1. 一個對象要想序列化五芝,必須滿足兩個條件:
  • 該類必須實現(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);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淤堵,隨后出現(xiàn)的幾起案子寝衫,更是在濱河造成了極大的恐慌,老刑警劉巖拐邪,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慰毅,死亡現(xiàn)場離奇詭異,居然都是意外死亡扎阶,警方通過查閱死者的電腦和手機(jī)汹胃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來东臀,“玉大人着饥,你說我怎么就攤上這事《韪常” “怎么了宰掉?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赁濒。 經(jīng)常有香客問我轨奄,道長,這世上最難降的妖魔是什么流部? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任戚绕,我火速辦了婚禮,結(jié)果婚禮上枝冀,老公的妹妹穿的比我還像新娘。我一直安慰自己耘子,他們只是感情好果漾,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谷誓,像睡著了一般绒障。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捍歪,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天户辱,我揣著相機(jī)與錄音,去河邊找鬼糙臼。 笑死庐镐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的变逃。 我是一名探鬼主播必逆,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了名眉?” 一聲冷哼從身側(cè)響起粟矿,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎损拢,沒想到半個月后陌粹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡福压,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年掏秩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧膏。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡哗讥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胞枕,到底是詐尸還是另有隱情杆煞,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布腐泻,位于F島的核電站决乎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏派桩。R本人自食惡果不足惜构诚,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铆惑。 院中可真熱鬧范嘱,春花似錦、人聲如沸员魏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撕阎。三九已至受裹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虏束,已是汗流浹背棉饶。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留镇匀,地道東北人照藻。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像坑律,于是被迫代替她去往敵國和親岩梳。 傳聞我的和親對象是個殘疾皇子囊骤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一、基礎(chǔ)知識:1冀值、JVM也物、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,390評論 0 4
  • 面向?qū)ο笾饕槍γ嫦蜻^程。 面向過程的基本單元是函數(shù)列疗。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,059評論 0 4
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法滑蚯,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,236評論 0 2
  • 五、IO流 1抵栈、IO流概述 (1)用來處理設(shè)備(硬盤告材,控制臺,內(nèi)存)間的數(shù)據(jù)古劲。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 513評論 0 0
  • 1斥赋、IO流 1.1、概述 之前學(xué)習(xí)的File類它只能操作文件或文件夾产艾,并不能去操作文件中的數(shù)據(jù)疤剑。真正保存數(shù)據(jù)的是文...
    Villain丶Cc閱讀 2,675評論 0 5