`

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

    博客分类:
  • Java
阅读更多

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


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

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

//将接收到的数据存到字节数组array
int firstChar = inputStream.read();
int length = inputStream.available();
byte[] array = new byte[length+1];
array[0] = (byte)firstChar;
inputStream.read(array,1,length);


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

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

 

 

分享到:
评论
2 楼 zhonghuayu121 2012-08-09  
服务端 ;InputStream is = socket.getInputStream(); //获取Socket输入流

客户端:ops.write(fileIsAndFileName.fileName.getBytes().length&0xff); ops.write(new String(fileIsAndFileName.fileName.getBytes()).getBytes());  大侠,我在客户端发送文件流之前压缩了这个文件的文件名以及文件类型(相当于扩展名吧)。但是我在服务端解压的时候,我该怎么把这个扩展名和文件流分别取出来呢?
1 楼 suitmefine 2010-06-02  
太感谢了!这个问题正困扰着呢,原来是这么回事情。学习了!

相关推荐

    java io流-3.pdf

    - **3.4 可用字节数统计**:`available()`方法返回输入流中可用的字节数。 - **3.5 跳过字节**:使用`skip(long n)`方法跳过指定数量的字节。 - **3.6 关闭输入流**:完成读取操作后,应调用`close()`方法关闭输入流...

    c#socket连接服务器

    通常我们需要使用 `NetworkStream` 类进行更方便的字节流操作: ```csharp NetworkStream stream = new NetworkStream(clientSocket); byte[] data = Encoding.UTF8.GetBytes("Hello, Server!"); stream.Write...

    Android通信传输图片显示在手机端

    - 将图片文件的大小(可用字节数)写入输出流,然后读取图片数据并写入输出流,最后刷新流以确保所有数据被发送。 2. **客户端(Android手机)Java代码**: - 在`Activity`的`onCreate()`方法中,启动一个新的...

    java实现socket从服务器连续获取消息的示例

    在循环内部,我们使用`available()`方法检查输入流中有多少可用字节,然后创建一个相应大小的缓冲区来存储这些字节。 ```java byte[] buffer = new byte[input.available()]; ``` 接着,我们调用`read()`方法读取...

    c# 发送与接收程序代码

    C#作为一种强大的面向对象编程语言,提供了多种方法来实现文件的发送与接收。本篇文章将重点介绍如何利用C#中的Socket编程技术来完成文件的发送与接收过程。 ### 二、准备工作 #### 1. 开发环境 - **Visual ...

    (超赞)JAVA精华之--深入JAVA API

    **3.1 Log4j基本使用方法** - **日志记录** - 使用 Log4j 进行日志记录的基本配置和使用。 **3.2 Dom4j 使用简介** - **XML解析** - 使用 Dom4j 解析和生成 XML 文档。 **3.3 Java 语言的 XML 验证 API** - *...

    ZendFramework中文文档

    14.1.3. 使用静态 get() 方法 14.2. 标准过滤器类 14.2.1. Alnum 14.2.2. Alpha 14.2.3. BaseName 14.2.4. Digits 14.2.5. Dir 14.2.6. HtmlEntities 14.2.7. Int 14.2.8. RealPath 14.2.9. StringToLower...

Global site tag (gtag.js) - Google Analytics