关于流
输入流:此流对应于键盘输入或者由主机环境或用户指定的另一个输入源
超类: InputStream (System.in 就属于这类 )
输出流:此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
超类: OutputStream (System.out 就属于这类。其实 System.err 也是间接属于它 )
流,顾名思义就是要流动,总是从高级流到低级流(底层流),象一层层小溪或者瀑布一样流了下来。一切都是流!
看一段程序
import
java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/** */ /**
*
* @author livahu
*/
public class ThreadedEchoServer ... {
/** *//** Creates a new instance of ThreadedEchoServer */
public ThreadedEchoServer() ...{
}
public static void main(String[] args) ...{
try ...{
int i = 1;
ServerSocket s = new ServerSocket(8189);
while (true) ...{
Socket incoming = s.accept();
System.out.println("Spawning " + i);
Runnable r = new ThreadedEchoHandler(incoming, i);
Thread t = new Thread(r);
t.start();
i++;
}
} catch (IOException ex) ...{
ex.printStackTrace();
}
}
}
class ThreadedEchoHandler implements Runnable ... {
private Socket incoming;
private int counter;
public ThreadedEchoHandler(Socket i, int c) ...{
incoming = i;
counter = c;
}
public void run() ...{
try ...{
try ...{
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.");
boolean done = false;
while (!done && in.hasNextLine()) ...{
String line = in.nextLine();
out.println("Echo: " + line);
if (line.trim().equals("BYE"))
done = true;
}
} finally ...{
incoming.close();
}
} catch (IOException ex) ...{
ex.printStackTrace();
}
}
}
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/** */ /**
*
* @author livahu
*/
public class ThreadedEchoServer ... {
/** *//** Creates a new instance of ThreadedEchoServer */
public ThreadedEchoServer() ...{
}
public static void main(String[] args) ...{
try ...{
int i = 1;
ServerSocket s = new ServerSocket(8189);
while (true) ...{
Socket incoming = s.accept();
System.out.println("Spawning " + i);
Runnable r = new ThreadedEchoHandler(incoming, i);
Thread t = new Thread(r);
t.start();
i++;
}
} catch (IOException ex) ...{
ex.printStackTrace();
}
}
}
class ThreadedEchoHandler implements Runnable ... {
private Socket incoming;
private int counter;
public ThreadedEchoHandler(Socket i, int c) ...{
incoming = i;
counter = c;
}
public void run() ...{
try ...{
try ...{
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.");
boolean done = false;
while (!done && in.hasNextLine()) ...{
String line = in.nextLine();
out.println("Echo: " + line);
if (line.trim().equals("BYE"))
done = true;
}
} finally ...{
incoming.close();
}
} catch (IOException ex) ...{
ex.printStackTrace();
}
}
}
此程序中就是让输出流OutputStream输出到了telnet应用程序(非命令行控制端),而通过InputStream接受来自用户的键盘输入。
PriterStream 用于包装OutputStream建立缓冲区,以便于输出。
而Scanner是JSEE5.0的新类,用于包装InputStream便于接受用户的(键盘)输入。
PrintStream和Scanner都是基础流的高级流。
高级流关闭底层流会自动关闭。
我一直对流都有点晕晕的,今天基本算搞清楚了所以然,所以在这里写出,一来为了记忆,一来也希望能对和我一样在这里有点模糊的一点帮助。(呵呵,不会就我一个人这么倒霉吧?)