博客已转到HuJinPu 's blog

http://blog.csdn.net/hujinpu

首页 新随笔 联系 聚合 管理
  24 Posts :: 0 Stories :: 25 Comments :: 0 Trackbacks

关于流

我一直对流都有点晕晕的,今天基本算搞清楚了所以然,所以在这里写出,一来为了记忆,一来也希望能对和我一样在这里有点模糊的一点帮助。(呵呵,不会就我一个人这么倒霉吧?) 

输入流:此流对应于键盘输入或者由主机环境或用户指定的另一个输入源

超类: InputStream (System.in 就属于这类 )

输出流:此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

超类: 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包装它(或叫结合产生过滤流)为了更方便的输出。利用out对象的println(String s)方法,我们可以把s的数据输出到out的缓冲区里面,然后如果数据满了缓冲区自动经过底层流输出到显示器或者由主机环境或用户指定的另一个输出目标,这里就是telnet应用程序窗口,而不是command控制台,如果数据未写满缓冲区println()也会自动调用flush()方法刷新缓冲区,输出数据。

 

posted on 2006-10-14 18:22 livahu 阅读(301) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: