网络流与文件流的可用字节数available的用法

本文探讨了在网络流和文件流中使用InputStream.available()方法来确定可读取字节数的不同之处。网络流需要先调用read()方法才能准确获取可用字节数,而文件流可以直接使用available()获取剩余字节数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网络流中如果不使用任何标记,是不知道流是否结束的。但在读到网络流时,我们是可以知道这次可以读多少字节的内容,方法就是使用inputStream. available (),但一定要在调用read()至少一次之后,也就是说available方法一定要在read后调用,不然就只能得到零值。注,这里所的是网络传输中的流是这样,但文件流不是这样的,文件流可以直接使用available来判断还有多少字节的内容可读取。


InputStream的available()含义:返回此输入流在不受阻塞情况下能读取的字节数。网络流与文件流不同的关键就在于是否“受阻”二字,网络socket流在读取时如果没有内容read()方法是会受阻的,所以从socket初始化的输入流的available也是为零的,所以要read一字节后再使用,这样可用的字节数就等于 available + 1。但文件读取时read()一般是不会受阻的,因为文件流的可用字节数
available = file.length(),而文件的内容长度在创建File对象时就已知了。
注:类InputStream的available方法总是返回0。

网络socket输入流可用字节数代码所示:

Java代码 复制代码  收藏代码
  1. //将接收到的数据存到字节数组array   
  2. int firstChar = inputStream.read();   
  3. int length = inputStream.available();   
  4. byte[] array = new byte[length+1];   
  5. array[0] = (byte)firstChar;   
  6. inputStream.read(array,1,length);  
//将接收到的数据存到字节数组array
int firstChar = inputStream.read();
int length = inputStream.available();
byte[] array = new byte[length+1];
array[0] = (byte)firstChar;
inputStream.read(array,1,length);


文件流的可用字节数如代码所示:

Java代码 复制代码  收藏代码
  1. FileInputStream fi = new FileInputStream("e:/tmp/tmp");   
  2.  //循环读出所有文件内容,可以在read前就直接使用   
  3. while (fi.available() > 0) {   
  4.     System.out.println((byte) fi.read());//直接输出内容的编码,而非字符编码。可能为负,如二进制的图片文件   
  5. }   
  6. fi.close();  

 

转自 http://jiangzhengjun.iteye.com/blog/509900

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值