Java IO流基础

输入输出流想必大家已经用的非常熟练了,但是,我们往往忽略了身边最熟悉的一些东西,又或者我 们只知道要这样做,却不知道为什么这么做,所以在这里跟大家分享一下在网络编程当中看到的一些关于 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表示数据的结束,因为我们永远不知道对方会在什么情况下真正结 束通信,就像关闭连接一样,另外一方得告诉你什么在什么情况下他这句话已经说完了,这就涉及到通信 协议了,下次再跟大家具体分析一下。

查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/Java/

时间: 2024-09-08 22:12:10

Java IO流基础的相关文章

Java IO流 文件传输基础_java

一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s="好好学习ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是

Java IO流学习总结一:输入输出流

Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入

Java IO: 流

原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流.正如这个系列教程之前提到过的,流通常会与数据源.数据流向目的地相关联,比如文件.网络等等. 流和数组不一样,不能通过索引读写数据.在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件.流仅仅只是一个连续的数据流. 某些类似PushbackInputStream 流的实现允许你将数据重新推回

java io流,下载图片问题

问题描述 java io流,下载图片问题 下载到本地的图片,为何是这样的,求解 解决方案 这个应该是解码的问题,你可以在上传图片的地方,打印出字节. 然后再下载的地方,打印字节,就可 以知道下的对不对了

java io流 如何判断结尾,-1和readline的null是怎么得到的

问题描述 java io流 如何判断结尾,-1和readline的null是怎么得到的 java io流 如何判断结尾,-1和readline的null是怎么得到的 在读取文件和在流里读取数据时怎么知道已经读完了. 我用server接收http请求,要判断结尾 解决方案 判断流的read是否为-1,类似如下 byte[] buffer = new byte[4096]; int n = 0; while (-1 != (n = input.read(buffer))) { output.writ

java IO流 之 输入流 InputString()的使用_java

本文主要给大家介绍java的InputStream 流的使用. (1)FileInputstream: 子类,读取数据的通道 使用步骤: 1.获取目标文件:new File() 2.建立通道:new FileInputString() 3.读取数据:read() 4.释放资源:close() //一些默认要导入的包 import java.io.File; import java.io.FileInputStream; import java.io.IOException; public sta

Java IO流系统整理

Java IO流的分类 Java中的流,可以从不同的角度进行分类. 按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图像或声音的二进制数据. 字符流:以字符(16位二进制)为单位进行处理. 都是通过字节流的方式实现的.字符流是对字节流进行了封装,方便操作.在最底层,所有的输入输出都是字节形式的. 后缀是Stream是字节流,而后缀是Reader,Writer是字符流.  

Java IO流学习总结八:Commons IO 2.5-IOUtils

Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/55051917 本文出自[赵彦军的博客] 在上一篇文章中,介绍了IO FileUtils的常规用法,今天介绍IOUtils的使用. 福利 另外我已经把Commons IO 2.5的源码发布到Jcenter,大家就不用下载jar包了,可以直接引用. Maven引用 <dependency> <group

Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54946762 本文出自[赵彦军的博客] 类的继承关系 InputStream |__ ByteArrayInputStream OutputStream |__ ByteArrayOutputStream ByteArrayInputStream 可以将字节数组转化为