站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题有关InputStream.available()一问

有关InputStream.available()一问

摘要: 有关InputStream.available()一问


服务器环境:tomcat5.5
JDK编译环境:1.4.2
代码中有读取流中相关信息的操作,为了节省开销,采用InputStream.available()来一次性读取,(在javadoc的中,有关available()的介绍为“返回此输入流方法的下一个调用方可以不受阻塞地从此输入流读取(或跳过)的字节数”),但发现用该方法并不能读取流中所有的字节,而是只能读取8192字节,请问是与什么因素有关,(PS:如果该流是通过InputStream is = getClass().getResourceAsStream(resourceName);方法创建就可以用该方法达到目的,而下面创建流的方式为HttpConnection的openInputStream方式创建,区别仅在此,得到的效果就不一样,不知是创建方式不同导致问题还是与应用服务器有关,或是其他原因,还望大家给个说法)代码如下:
InputStream is = httpConn.openInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[is.available()];

while (is.read(bytes) != -1) {
baos.write(bytes);
}


“返回此输入流方法的下一个调用方可以不受阻塞地从此输入流读取(或跳过)的字节数”

如果这是一个Socket的InputStream,那么它的read方法就可能导致阻塞(即表示read方法可能一直等待对方发送的数据而不返回)


available根本不是表示这个流有多长的意思,对于Socket之类的InputStream根本无法判断这个流会有多长。


楼上的大神都解释完了,没我什么说的拉,混个分


楼上的解释明白了,但此例是用HttpConnection的openInputStream创建的流,与Socket无关,该如何理解


HttpConnection本质上就是一个Socket连接罢了。

反正你是不可以根据available判断长度的
InputStream is = httpConn.openInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int readed = -1;
while ((readed = is.read(bytes)) != -1) {
baos.write(bytes, 0 , readed);
}




“HttpConnection本质上就是一个Socket连接罢了”
你是指http协议封装了TCP协议,而socket本身就是基于TCP/IP协议的,所以两者有共同之处?


HttpConnection是基于更高层次罢了,它本质上就是向服务器的80端口发起了一个Socket连接

所以不能说有共同之处,而是HttpConnection依赖于Socket的存在。


算是理解了,谢谢!


↑返回目录
前一篇: ImageItem的问题
后一篇: 如何让类自己结束自己?