0
点赞
收藏
分享

微信扫一扫

【Java】IO流


传统java技术中的输入输出是基于流模型的。可以将流想象为一个管道。进行任何的输入输出操作之前,必须先得到管道。

管道分为两种,一个是字节流,一个是字符流。字节流的单位是byte,通常对应文件,图片等。字符的单位是int,与字符集编码有关。

所有的字节流输入的父类是InputStream,是一个抽象类。相应的输出是OutputStream。既然是抽象类,那么必然存在实现的子类,常见的有FileInputStream,对应文件的处理。拿输入来说,主要有三个重载的read方法。

所有的字符流输入的父类是Reader,输出为Writer。实现类有FileReader 和 FileWriter。

另外还有一个维度,就是Buffered的流,之前的流都是不涉及缓冲的,是一个字节或者字符读取的,效率不高。这里的Buffered类的流是在原有的stream或者reader/writer上嵌套的一个流或者层,实现了缓冲机制,即读入缓冲区或者写入缓冲区,提高了IO效率。在使用buffered类的写入方法时,需要使用flush方法,否则可能会有内容残留在换冲区。

有一点需要澄清,普通的InputStream实现类也有读入缓冲区的方法,但是这个不是基于真正的缓冲区实现的,只是简单地多次调用读取一个字节或者字符的方法,效率没有提升,bufferd类的read方法才是真正的在实现中加入了缓冲区的概念。

在socket编程中,我们在收到一个请求时,会调用流的read方法来读取数据,要注意这个read方法是阻塞的,如果没有内容就等待,通常对应了一个while,检测是不是读到-1。那么我们会认为,如果对方发完了,最后就是结束符-1,这个while会结束,其实并不是,及时最后我们发完了数据,read方法会阻塞在那里,也就是它没有返回-1,这样while就不会退出。这样的while在文件处理中是适用的,因为文件结束符就是-1,但是在网络中却不是,网络中我们发完数据并不会添加一个结束符,也没有人帮我们添加,这就是read阻塞在那里的原因,因此这点需要注意和处理。

举报

相关推荐

java io流

Java IO流

【java】io流

java IO流

java -io流

0 条评论