Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于InputStream类的available()方法

关于InputStream类的available()方法

作者头像
HUC思梦
发布于 2020-09-03 02:48:33
发布于 2020-09-03 02:48:33
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。 http://www.cnblogs.com/CandiceW/p/5486112.html

能否使用取决于实现了InputStream这个抽象类的具体子类中有没有实现available这个方法。如果实现了那么就可以取得大小,如果没有实现那么就获取不到。例如FileInputStream就实现了available方法,那么就可以用new byte[in.available()];这种方式。但是,网络编程的时候Socket中取到的InputStream,就没有实现这个方法,那么就不可以使用这种方式创建数组。

如果这样写代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count = in.available(); 
  byte[] b = new byte[count]; 
  in.read(b); 

在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。 需要改成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count = 0; 
  while (count == 0) { 
   count = in.available(); 
  } 
  byte[] b = new byte[count]; 
  in.read(b);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java之InputStream读取数据问题
在从数据流里读取数据时,为图简单,经常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。
IT工作者
2022/03/29
6640
java inputstream读取文件_java如何获取输入的数据
InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。
全栈程序员站长
2022/11/08
2.8K0
“挑三拣四”地学一学Java I/O
古人云:“读书破万卷,下笔如有神”。也就是说,只有大量的阅读,写作的时候才能风生水起——写作意味着输出(我的知识传播给他人),而读书意味着输入(从他人的知识中汲取营养)。
沉默王二
2019/03/14
4350
“挑三拣四”地学一学Java I/O
Java之InputStream实战指南:轻松读取、操作文件流
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/16
1.4K0
Java之InputStream实战指南:轻松读取、操作文件流
第78节:Java中的网络编程(上)
网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节.
达达前端
2019/07/03
5980
第78节:Java中的网络编程(上)
17:网络编程
第一  概述 一、概述: 1、网络模型:OSI参考模型和TCP/IP参考模型 2、网络通讯要素: 1)IP地址:InetAddress    .网络中设备的标识    .不易记忆,可用主机名 Int
六月的雨
2018/05/14
6890
手写一个简单的Server和Client
西瓜籽:“这也太简单了,我知道发起一个HTTP请求和建立一个Socket连接区别不大,所以我要手写一个HttpClient(客户程序)和HTTPServer(HTTP服务器)。”
东边的大西瓜
2022/05/05
2710
手写一个简单的Server和Client
Socket java.net.SocketException: Connection reset的解决方案[通俗易懂]
背景: 服务端通讯方式:TCP/IP socket 短链接。 首先看下我的最开始的socket代码:
全栈程序员站长
2022/09/14
3K0
Java网络编程的Java流介绍
网络程序所做的很大一部分工作都是简单的输入输出:将数据字节从一个系统移动到另一个系统。Java的I/O建立于流(stream)之上。输入流读取数据,输出流写入数据。过滤器流(filter)流可以串联到输入或输出流上。读写数据时过滤器可以修改数据(加密或压缩),或者只是提供额外的方法,将读/写的数据转换为其他格式。阅读器(reader)和书写器(writer)可以串链到输入流和输出流上,允许程序读/写文本而不是字节。
纪莫
2018/12/19
8890
java基础知识02
1、String字符串: 字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。用length()方法获取长度。
贪挽懒月
2018/12/05
5640
java基础知识02
BIO、NIO
我们平常使用的IO是BIO(Blocking-IO),即阻塞IO、而NIO(No-blocking-IO)则是非阻塞IO,二者有什么区别呢?
晚上没宵夜
2020/03/11
7760
BIO、NIO
InputStream read()方法详解「建议收藏」
  在Java7中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。   查阅Java7 API,我们可以看到,在InputStream中定义了三个重载的read()方法:
全栈程序员站长
2022/11/08
7890
InputStream read()方法详解「建议收藏」
如何利用InputStream类实现文件读取与处理?
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/21
6080
如何利用InputStream类实现文件读取与处理?
I/O
在 Java 程序中所创建的对象都保存在内存中,一旦 JVM 停止运行,这些对象都将会消失。因此以下两种情况必须通过序列化实现:
Qwe7
2022/08/12
6670
Java IO编程必备:FilterInputStream类的原理与实现
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,一群人方能走的更远。
喵手
2023/11/17
2680
Java IO编程必备:FilterInputStream类的原理与实现
第57节:Java中流的操作以及编码解码
编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为coding,逆过程为解码.编码时用代码表示的,解码为Decoding,有了编码就有相关的编码表,是对生活中的文件和计算机进行二进制的对应关系.
达达前端
2019/07/03
5420
第57节:Java中流的操作以及编码解码
Java基础总结大全(4)
最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习视频】获取下载链接) ●【新】HTML5知识点视频更新了!(回复【前端资料】获取下载链接) ●答案公布时间:为每期发布题目的第二天 ★【新】回复“测试题”获取昨天发布的软件工程师初级阶段测试题答案 ★【新】回复“学习资料”获取java学习电子文档 ★【新】需要求职简历模板的可以加小编微信xxf960513 聊天系统 ●我希望大家积极参与答题!有什么不
Java学习
2018/04/16
9760
Java---网络编程(3)-TCP-互传文件和图片
建立连接,形成传输数据的通道。 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低
谙忆
2021/01/21
1K0
Java---网络编程(3)-TCP-互传文件和图片
第62节:探索Java中的网络编程技术
网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考.
达达前端
2019/07/03
3790
第62节:探索Java中的网络编程技术
JDK1.9-TCP通信程序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/10
4240
JDK1.9-TCP通信程序
相关推荐
java之InputStream读取数据问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验