网络程序的主要工作就是输入输出;在JAVA中网络上的读取数据与发送数据就和读些文件一样,没有区别。JAVA以流(Stream)作为输入输出的基础。Input Stream用来读数据,Output Stream用来写数据;不同的流类用来读取不同的数据源,但都有共同的读写方法,底层对开发者透明。过滤器流可以链接在一起用来修改数据,格式化等;比如DataOutputStream 就可以把int型转化成四个字节写入底层输出流。Readers和writers可以与输入,输出流链接来读写文本,可以支持像 UTF-8等众多的字符编码。流是同步的。即程序必须在读写流时阻塞。JDK1.4通过Channel和Buffer支持非阻塞流,非阻塞流提高了更高的速度。因为这两者都建立在流的基础之上,我们先讨论流,在第十二章将讨论非阻塞I/O流。Output Stream 输出流public abstract class OutputStream 输出流的基类,依据多态的原则屏蔽了许多底层信息。比如TelnetOutputStream 你在SUN的API文档中找不到它,但它真实存在,SUN故意在文档中将其屏蔽。其实在java.net.Socket类中的getOutputSteam得到的就是就是这个流public abstract void write(int b) throws IOException 这个方法是一个最基本的方法,一次向流中写一个字节,(b的范围是0-255)这种方法比较低效。更好的方式是write(byte[] data) or write(byte[] data, int offset, int length)这两个方式一次向流中写多个字节。流可以缓冲,无论通过硬件还是软件都可以实现。链接BufferedOutputStream或BufferedWriter 就可以达到这个目的。flush()方法的作用。假设我们的缓冲大小是1024k,但是客户端一次只发送了300k给服务器端并等待相应。服务器端由于没有接收完毕所以不会给出响应,因此会造成死锁。flush就是用来避免死锁的发生。对于缓冲的流,flush是必要的,对于不需要缓冲的流,调用flush是低效的。流在工作完成后应调用close()方法关闭以释放资源。