Java的IO流


流的本質(zhì)是數(shù)據(jù)傳輸,可以被看作一組有序的字節(jié)集合者春,跟據(jù)處理數(shù)據(jù)類(lèi)型的不同栅隐,流可以分為兩大類(lèi):字節(jié)流和字符流。字節(jié)流以字節(jié)(8bit)為單位屈糊,包含兩個(gè)抽象類(lèi):InputStream(輸入流)和OutPutStream(輸出流)的榛。字符流以字符(16bit)為單位,根據(jù)碼表映射字符逻锐,一次可以讀多個(gè)字節(jié)夫晌,它包含兩個(gè)抽象類(lèi):Reader(輸入流)和Writer(輸出流)雕薪。字節(jié)流和字符流的主要區(qū)別為:字節(jié)流在處理輸出時(shí)不會(huì)用到緩存,而字符流用到了緩存晓淀。Java類(lèi)在設(shè)計(jì)時(shí)采用了Decorator(裝飾者)模式所袁。


IO設(shè)計(jì)類(lèi).png

使用這種設(shè)計(jì)模式的好處是可以在運(yùn)行時(shí)動(dòng)態(tài)地給對(duì)象添加一些額外的職責(zé),與使用繼承的設(shè)計(jì)方法相比凶掰,該方法具有很好的靈活性燥爷。例如,要設(shè)計(jì)一個(gè)輸入流的類(lèi)懦窘,用來(lái)在讀文件時(shí)把文件中大寫(xiě)字母換成小寫(xiě)字母前翎,把小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母。在設(shè)計(jì)時(shí)畅涂,可以通過(guò)繼承抽象類(lèi)裝飾者類(lèi)(FilterInputStream)來(lái)實(shí)現(xiàn)一個(gè)裝飾類(lèi)港华,通過(guò)調(diào)用InputStream類(lèi)或其子類(lèi)提供的一些方法再加上邏輯判斷。

class MyInputStream extends FilterInputStream{
    public MyInputStream(InputStream in){
        super(in);
    }
    public int read() throws IOException{
        int c = 0;
        if((c = super.read())!= -1) {
            if(Character.isLowerCase((char) c)){
                return Character.toUpperCase((char) c);
            }
            else if(Character.isLowerCase((char) c)){
                return Character.toUpperCase((char) c);
            }
            else
                return c;
        } else
            return -1;
    }
}
public class Test{
    public static void main(String []args) {
        int c;
        try{
            InputStream is = new MyInputStream(new FileInputStream("text.txt"));
            while((c = is.read()) >= 0) {
                System.out.println(c);
            }
        }catch(IOException) {
            System.out.println(e.getMessage());
        }
    }
}

Java Socket
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換午衰,這個(gè)雙向鏈路的一端稱(chēng)為一個(gè)Socket(也稱(chēng)套接字)立宜,在Java中,Socket可以分為兩種類(lèi)型:面向連接的Socket通信協(xié)議(TCP)臊岸,和面向無(wú)連接的Socket通信協(xié)議(UDP)赘理。任何一個(gè)Socket都是有IP地址和端口號(hào)唯一確定。
基于TCP的通信過(guò)程:

  • Server(服務(wù)器)Listen(監(jiān)聽(tīng))指定的某個(gè)端口(建議使用大于端口)是否有連接請(qǐng)求扇单;
  • Client(客戶端)向Server端發(fā)出連接請(qǐng)求商模;
  • Server端向Client端發(fā)回Accept(接受)消息。

示例:
Server端:

class Server{
    public static void main(String []args){
        BufferedReader br = null;
        PrintWriter pw = null;
        try{
            ServerSocket server = new ServerSocket(2000);
            Socket  socket = server.accept();
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw = new PrintWriter(socket.getOutputStream(),true);
            String s = br.readLine();
            pw.println(s);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                br.close();
                pw.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

客戶端程序:

class Client{
    public static void main(String []args){
        bufferedReader br = null;
        PrintWriter pw = null;
        try{
            Socket socket = new Socket("localhost", 2000);
            br = new BufferedReader(new InputStream(socket.getInputStream()));
            pw = new PrintWriter(socket.getOutputStream(), true);
            pw.println("hello"); //向服務(wù)器發(fā)送數(shù)據(jù)
            String s = null;
            while(true){
                s = br.readLine();
                if(s != null) break;
            }
            System.out.println(s);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                br.close();
                pw.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

Java序列化
序列化石一種將對(duì)象以一連串的字符描述的過(guò)程蜘澜,用于解決在對(duì)對(duì)象流進(jìn)行讀寫(xiě)操作時(shí)所引發(fā)的問(wèn)題施流。序列化可以將對(duì)象的狀態(tài)寫(xiě)在流里進(jìn)行網(wǎng)絡(luò)傳輸,或者保存到文件鄙信、數(shù)據(jù)庫(kù)等系統(tǒng)里瞪醋,并在需要時(shí)把該流讀取出來(lái)重新構(gòu)造一個(gè)相同的對(duì)象。
序列化有以下兩個(gè)特點(diǎn):

  • 如果一個(gè)類(lèi)能被序列化装诡,那么它的子類(lèi)也能被序列化银受;
  • 由于static代表類(lèi)的成員,transient(Java關(guān)鍵字)代表臨時(shí)數(shù)據(jù)鸦采,因此被聲明為這兩種類(lèi)型的數(shù)據(jù)成員是不能被序列化的宾巍。

Java提供了多個(gè)對(duì)象序列化的接口,包括ObjectOutput渔伯、ObjectInput顶霞,ObjectOutputStream和ObjectInputStream。

在以下情況下需要使用該序列化:

  • 需要通過(guò)網(wǎng)絡(luò)來(lái)發(fā)送對(duì)象锣吼,或?qū)ο蟮臓顟B(tài)需要被持久化到數(shù)據(jù)庫(kù)或文件中选浑。
  • 序列化能實(shí)現(xiàn)深復(fù)制蓝厌,即可以復(fù)制引用的對(duì)象。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末古徒,一起剝皮案震驚了整個(gè)濱河市拓提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧膘,老刑警劉巖代态,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舀寓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肌蜻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)互墓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蒋搜,你說(shuō)我怎么就攤上這事篡撵。” “怎么了豆挽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵育谬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我帮哈,道長(zhǎng)膛檀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任娘侍,我火速辦了婚禮咖刃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憾筏。我一直安慰自己嚎杨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布氧腰。 她就那樣靜靜地躺著枫浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古拴。 梳的紋絲不亂的頭發(fā)上箩帚,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音黄痪,去河邊找鬼膏潮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛满力,可吹牛的內(nèi)容都是我干的焕参。 我是一名探鬼主播轻纪,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叠纷!你這毒婦竟也來(lái)了刻帚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涩嚣,失蹤者是張志新(化名)和其女友劉穎崇众,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體航厚,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顷歌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔睬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯漩。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖麻顶,靈堂內(nèi)的尸體忽然破棺而出赦抖,到底是詐尸還是另有隱情,我是刑警寧澤辅肾,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布队萤,位于F島的核電站,受9級(jí)特大地震影響矫钓,放射性物質(zhì)發(fā)生泄漏要尔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一新娜、第九天 我趴在偏房一處隱蔽的房頂上張望盈电。 院中可真熱鬧,春花似錦杯活、人聲如沸匆帚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吸重。三九已至,卻和暖如春歪今,著一層夾襖步出監(jiān)牢的瞬間嚎幸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工寄猩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉晶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像替废,于是被迫代替她去往敵國(guó)和親箍铭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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