博客已轉(zhuǎn)到HuJinPu 's blog

          http://blog.csdn.net/hujinpu

          首頁 新隨筆 聯(lián)系 聚合 管理
            24 Posts :: 0 Stories :: 25 Comments :: 0 Trackbacks

          關(guān)于流

          我一直對流都有點暈暈的,今天基本算搞清楚了所以然,所以在這里寫出,一來為了記憶,一來也希望能對和我一樣在這里有點模糊的一點幫助。(呵呵,不會就我一個人這么倒霉吧?)?

          輸入流:此流對應(yīng)于鍵盤輸入或者由主機環(huán)境或用戶指定的另一個輸入源

          超類: InputStream (System.in 就屬于這類 )

          輸出流:此流對應(yīng)于顯示器輸出或者由主機環(huán)境或用戶指定的另一個輸出目標。

          超類: OutputStream (System.out 就屬于這類。其實 System.err 也是間接屬于它 )

          ?

          一切都是流!

          看一段程序

          ?

          ?1 /*
          ?2 ?*?ThreadedEchoServer.java
          ?3 ?*
          ?4 ?*?Created?on?2006年10月14日,?上午11:57
          ?5 ? */

          ?6
          ?7 package ?corejava;
          ?8
          ?9 import ?java.io.IOException;
          10 import ?java.io.InputStream;
          11 import ?java.io.OutputStream;
          12 import ?java.io.PrintWriter;
          13 import ?java.net.ServerSocket;
          14 import ?java.net.Socket;
          15 import ?java.util.Scanner;
          16
          17 /**
          18 ?*
          19 ?*? @author ?livahu
          20 ? */

          21 public ? class ?ThreadedEchoServer? {
          22 ????
          23 ???? /** ?Creates?a?new?instance?of?ThreadedEchoServer? */
          24 ???? public ?ThreadedEchoServer()? {
          25 ????}

          26 ????
          27 ???? public ? static ? void ?main(String[]?args)? {
          28 ???????? try ? {
          29 ???????????? int ?i? = ? 1 ;
          30 ????????????ServerSocket?s? = ? new ?ServerSocket( 8189 );
          31 ????????????
          32 ???????????? while ?( true )? {
          33 ????????????????Socket?incoming? = ?s.accept();
          34 ????????????????System.out.println( " Spawning? " ? + ?i);
          35 ????????????????Runnable?r? = ? new ?ThreadedEchoHandler(incoming,?i);
          36 ????????????????Thread?t? = ? new ?Thread(r);
          37 ????????????????t.start();
          38 ????????????????i ++ ;
          39 ????????????}

          40 ????????}
          ? catch ?(IOException?ex)? {
          41 ????????????ex.printStackTrace();
          42 ????????}

          43 ????}

          44 }

          45
          46 class ?ThreadedEchoHandler? implements ?Runnable? {
          47 ???? private ?Socket?incoming;
          48 ???? private ? int ?counter;
          49 ????
          50 ???? public ?ThreadedEchoHandler(Socket?i,? int ?c)? {
          51 ????????incoming? = ?i;
          52 ????????counter? = ?c;
          53 ????}

          54 ????
          55 ???? public ? void ?run()? {
          56 ???????? try ? {
          57 ???????????? try ? {
          58 ????????????????InputStream?inStream? = ?incoming.getInputStream();
          59 ????????????????OutputStream?outStream? = ?incoming.getOutputStream();
          60 ????????????????
          61 ????????????????Scanner?in? = ? new ?Scanner(inStream);
          62 ????????????????PrintWriter?out? = ? new ?PrintWriter(outStream,? true );
          63 ????????????????out.println( " Hello!?Enter?BYE?to?exit. " );
          64 ????????????????
          65 ???????????????? boolean ?done? = ? false ;
          66 ???????????????? while ?( ! done? && ?in.hasNextLine())? {
          67 ????????????????????String?line? = ?in.nextLine();
          68 ????????????????????out.println( " Echo:? " ? + ?line);
          69 ???????????????????? if ?(line.trim().equals( " BYE " ))
          70 ????????????????????????done? = ? true ;
          71 ????????????????}

          72 ????????????}
          ? finally ? {
          73 ????????????????incoming.close();
          74 ????????????????
          75 ????????????}

          76 ????????}
          ? catch ?(IOException?ex)? {
          77 ????????????ex.printStackTrace();
          78 ????????}

          79 ????}

          80 ????
          81 }

          82

          ?

          我們來分析其中一段?
          ?????????????????InputStream inStream = incoming.getInputStream();

          ??????????????? OutputStream outStream = incoming.getOutputStream();

          ???????????????

          ??????????????? Scanner in = new Scanner(inStream);

          ??????????????? PrintWriter out = new PrintWriter(outStream, true);

          ??????????????? out.println("Hello! Enter BYE to exit.");

          ?

          incoming?是一個Socket對象,getInputStream()方法返回一個InputStream對象,用于接受用戶從文件或者鍵盤或者其它源的輸入。而getOutputStream() 方法用來返回一個OutputStream對象,用來得到一個Socket的輸出流,再用PrintWriter包裝它(或叫結(jié)合產(chǎn)生過濾流)為了更方便的輸出。利用out對象的println(String s)方法,我們可以把s的數(shù)據(jù)輸出到out的緩沖區(qū)里面,然后如果數(shù)據(jù)滿了緩沖區(qū)自動經(jīng)過底層流輸出到顯示器或者由主機環(huán)境或用戶指定的另一個輸出目標,這里就是telnet應(yīng)用程序窗口,而不是command控制臺,如果數(shù)據(jù)未寫滿緩沖區(qū)println()也會自動調(diào)用flush()方法刷新緩沖區(qū),輸出數(shù)據(jù)。

          ?

          posted on 2006-10-14 18:22 livahu 閱讀(357) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 赤城县| 海阳市| 泗水县| 吉安县| 开远市| 望城县| 庄浪县| 顺平县| 西林县| 南川市| 宜兰县| 永靖县| 昌吉市| 石嘴山市| 鄱阳县| 嘉兴市| 塔河县| 黔西| 洪雅县| 大埔县| 铁力市| 千阳县| 辉县市| 赤峰市| 雷波县| 光泽县| 南郑县| 玉环县| 拉孜县| 嫩江县| 吉木乃县| 紫金县| 牟定县| 安达市| 萝北县| 霞浦县| 兴化市| 巫溪县| 南漳县| 思南县| 汝州市|