输入输出流想必大家已经用的非常熟练了,但是,我们往往忽略了身边最熟悉的一些东西,又或者我们只知道要这样做,却不知道为什么这么做,所以在这里跟大家分享一下在网络编程当中看到的一些关于I/O流的细节,闲话不多说,下面开始:
OutputStream,顾名思义:输出流,它的子类使用所提供的方法向某种媒体写入数据,例如,FileOutputStream将数据写入文件,TelnetOutputStream将数据写入网络连接,不过听到这大家会问了,API中不存在TelnetOutputStream这个类呀,不过想必大家都记得,Sokcet类中有一个getOutputStream的方法,这个方法是获得连接对象的输出流,返回的是OutputStream,其本质更彻底的说应该是网络输出流,这是多态的威力,如果你知道怎么使用这些超类,你也就知道怎么使用所有这些子类。
OutputStream中最基本的方法无疑就是write(int b)了,这里虽然传入了一个Int,但只接收0-255范围之内的整数,大家在DataOutputStream中想必还看到过一个writeByte(int v)的方法,这个方法确保了一个Byte以一个Byte的形式写入数据,并且将数据追加到了缓冲区中。
说到缓冲区就不得不提一个flush方法,想必大家也都用过它,我们知道在OutputStream调用write方法的时候往往需要调用一个flush方法,简单的说是为了刷新缓冲区,强制输出数据,但是为什么要强制输出呢?举一个这样的例子:假设一台服务器与一台客户机之间正在进行通信,这个时候服务器在等待客户机的消息,如果客户机发送了300个字节的请求,但是默认缓冲区的大小是1024个字节,那么这个流的缓冲区就会等待更多的数据到来,而客户机以为自己的数据已经发出去了,自然会等待着服务器的响应,结果服务器那边由于缓冲区还没满,所以数据迟迟没有来到,结果就形成了一种死锁状态。所以我们经常会调用flush方法,不管你是否认为有必要刷新缓冲区,这都是很重要的,取决于你如何控制流的引用,你可能知道流被缓冲,也可能不知道(例如,不管你是否希望,System.out都是缓冲的),flush相对程序出错而言是一个低成本的操作,所以在需要刷新输出的时候不要忘了写上哦。
InputStream,输入流,其本质与输出流刚好形成对立的关系,用来从媒体中读取数据,最基本的方法是没有参数的read()方法,这个方法从输入流的源中读取一个字节数据,作为一个0到255的int返回,流的结束由返回-1结束,read()方法会等待并阻塞其后的任何代码的执行,知道有一个字节的数据可用。但是我们在写通信的时候却往往不能用-1表示数据的结束,因为我们永远不知道对方会在什么情况下真正结束通信,就像关闭连接一样,另外一方得告诉你什么在什么情况下他这句话已经说完了,这就涉及到通信协议了,下次再跟大家具体分析一下。
相关推荐
java基础之IO流,基础简介知识,帮助你了解java的io技术
此文档属于本人当初学习java基础之IO流,所整理的文档。里面有字节流与字符流的比较,也有总结使用不同方式读取文档的demo。希望对你的学习有帮助,谢谢!
java零基础自学 之 JavaIO流处理java零基础自学 之 JavaIO流处理
关于java的IO流基础的练习,适合刚接触IO流,没有基础的同学
该文档主要整理了Java IO流的相关信息,主要包括IO流的按照不同维度的分类、节点流、处理流、输入输出流的处理过程、抽象基类的使用等细节内容
586.584.JAVA基础教程_IO流-IO流的体系结构(586).rar
IO流自用模板,平时工作遇到IO流,我都是套用我这个基础模板
使用IO流,上传下载文件,包含java代码、详细解释和测试类
java中的IO流的基础教学,我在里面写了关于IO流最基础的几个类
Java-IO流基础例题 & 例题源码 & PPT教学文档(黑马程序员详细版)。
JAVA 中为什么提出流的概念? java 中流的分类, 每种流的 简单例子,可以体系的学习 io流
对于C++IO流基本知识的分析总结及一些简单的案例分析,适合于初学者进行学习
java基础,IO基础,自己总结的笔记。
完整版 Java基础入门教程 Java程序语言设计 04 IO流 输入输出流(共31页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI AWT 事件模型(共27页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI GUI...
反射,枚举,IO流,正则表达式,线程,模式,泛型
流总结,很全的东西,梳理脉络,基础学习.io流总结,很全的东西,梳理脉络,基础学习.io流总结,很全的东西,梳理脉络,基础学习.io流总结,很全的东西,梳理脉络,基础学习.
Java的核心库java.io提供了全面...Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在具体使用中很多初学者对Java.io包的使用非常含糊,本文将详细解说关于Java.io的使用…………
使用文件IO流。 了解FILE的基础知识,内容非常详细,您可以快速了解File类。 所有与IO相关的常用类,以及该类的抽象和具体关系
Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。此外,Java也对块传输提供支持,在核心库java.nio中采用的便是块IO。关于NIO我们在后面还有专门的讨论。 流IO的好处是简单...
Java中IO流的基础知识点