转载自   Java IO: InputStream

译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com)

InputStream类是Java IO API中所有输入流的基类。InputStream子类包括FileInputStream,BufferedInputStream,PushbackInputStream等等。参考Java IO概述这一小节底部的表格,可以浏览完整的InputStream子类的列表。

Java InputStream例子

InputStream用于读取基于字节的数据,一次读取一个字节,这是一个InputStream的例子:

InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");
int data = inputstream.read();
while(data != -1) { //do something with data...  doSomethingWithData(data);   data = inputstream.read();
}
inputstream.close();

这个例子创建了FileInputStream实例。FileInputStream是InputStream的子类,所以可以把FileInputStream实例赋值给InputStream变量。

注意:为了清晰,代码忽略了一些必要的异常处理。想了解更多异常处理的信息,请参考Java IO异常处理。

从Java7开始,你可以使用“try-with-resource”结构确保InputStream在结束使用之后关闭,链接指向了一篇关于“try-with-resource”是如何工作的文章,这里只是一个简单的例子:

try( InputStream inputstream = new FileInputStream("file.txt") ) {int data = inputstream.read();while(data != -1){System.out.print((char) data);data = inputstream.read();}
}

当执行线程退出try语句块的时候,InputStream变量会被关闭。

read()

read()方法返回从InputStream流内读取到的一个字节内容(译者注:0~255),例子如下:

int data = inputstream.read();

你可以把返回的int类型转化成char类型:

char aChar = (char) data;

InputStream的子类可能会包含read()方法的替代方法。比如,DataInputStream允许你利用readBoolean(),readDouble()等方法读取Java基本类型变量int,long,float,double和boolean。

流末尾

如果read()方法返回-1,意味着程序已经读到了流的末尾,此时流内已经没有多余的数据可供读取了。-1是一个int类型,不是byte或者char类型,这是不一样的。

当达到流末尾时,你就可以关闭流了。

read(byte[])

InputStream包含了2个从InputStream中读取数据并将数据存储到缓冲数组中的read()方法,他们分别是:

  • int read(byte[])
  • int read(byte, int offset, int length)

一次性读取一个字节数组的方式,比一次性读取一个字节的方式快的多,所以,尽可能使用这两个方法代替read()方法。

read(byte[])方法会尝试读取与给定字节数组容量一样大的字节数,返回值说明了已经读取过的字节数。如果InputStream内可读的数据不足以填满字节数组,那么数组剩余的部分将包含本次读取之前的数据。记得检查有多少数据实际被写入到了字节数组中。

read(byte, int offset, int length)方法同样将数据读取到字节数组中,不同的是,该方法从数组的offset位置开始,并且最多将length个字节写入到数组中。同样地,read(byte, int offset, int length)方法返回一个int变量,告诉你已经有多少字节已经被写入到字节数组中,所以请记得在读取数据前检查上一次调用read(byte, int offset, int length)的返回值。

这两个方法都会在读取到达到流末尾时返回-1。

这是一个使用InputStream的read(byte[])的例子:

InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");
byte[] data = new byte[1024];
int bytesRead = inputstream.read(data);
while(bytesRead != -1) {doSomethingWithData(data, bytesRead);bytesRead = inputstream.read(data);
}
inputstream.close();

在代码中,首先创建了一个字节数组。然后声明一个叫做bytesRead的存储每次调用read(byte[])返回值的int变量,并且将第一次调用read(byte[])得到的返回值赋值给它。

在while循环内部,把字节数组和已读取字节数作为参数传递给doSomethingWithData方法然后执行调用。在循环的末尾,再次将数据写入到字节数组中。

你不需要想象出read(byte, int offset, int length)替代read(byte[])的场景,几乎可以在使用read(byte, int offset, int length)的任何地方使用read(byte[])。

输入流和数据源

一个输入流往往会和数据源联系起来,比如文件,网络连接,管道等,更多细节已经在Java IO概述文章中介绍过了。

Java IO: InputStream相关推荐

  1. struts2文件下载出现Can not find a java.io.InputStream with the name的错误

    今天在用struts2就行文件下载时出现如下错误: Servlet.service() for servlet default threw exception java.lang.IllegalArg ...

  2. Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack.

    1.错误描述 八月 14, 2015 4:22:45 下午 com.opensymphony.xwork2.util.logging.jdk.JdkLogger error 严重: Exception ...

  3. Java IO 体系(二): inputstream与outputstream

    Java中文件数据流操作有2个大类:OutputStream/InputStream接口 和 FileWriter/FileReader类 1. OutputStream接口:所有字节输出流的超类 包 ...

  4. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  5. java urlconn 下载慢_使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法...

    import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAc ...

  6. 你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了

    文章结构 1 flush的使用场景 2 一个java字节流,inputstream 和 outputstream的简单例子 3 分别测试了可能抛出java.io.FileNotFoundExcepti ...

  7. java io 文件复制_实例讲述Java IO文件复制

    前言:IO流主要分为两大类,分别是字节流与字符流 注意: 1.音频文件.图片.视频(范围广),就用字节流 2.只涉及到文本的,就用字符流 使用字节流复制文本内容(其他文件也可以) 代码如下: impo ...

  8. java io 读取配置文件_java读取配置文件 - tomzhao2008的个人空间 - OSCHINA - 中文开源技术交流社区...

    对于要打包成jar文件来运行来说,用file是会有问题的,下面的程序可以解决这样的问题 1.ReadPropsUtil /** * */ package readproperties; import ...

  9. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

    1. File类 File 路径问题: 上下级文件夹之间使用分隔符分开: 在Windows中分隔符为'\' ,在Unix/Linux中分隔符为'/' 跨平台分隔符: 专业的做法是使用File.sepa ...

最新文章

  1. 洛谷P3572 [POI2014]PTA-Little Bird
  2. 软件安装:原始码与 Tarball
  3. 字典树(前缀树)-Java实现
  4. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法
  5. Neo4j简单的样例
  6. visio思维导图模板_如何下载思维导图模板?在线教你找精美漂亮的思维导图
  7. [蓝桥杯][算法提高VIP]分分钟的碎碎念(dfs)
  8. hanlp 训练模型_LTP 4.0!单模型完成6项自然语言处理任务
  9. Chrome谷歌浏览器76地址栏隐藏的HTTPS和WWW标记如何恢复
  10. 考试君 - 基于.NET 5语言的Furion框架开发在线考试系统
  11. MySQL实现远程备份的原理_mysql实现自动远程备份一办法
  12. android手机连接windows,将Android手机投影到Windows 10 PC [夏昆冈]
  13. [Learn Notes] CSS学习笔记
  14. 工作经验--他人经验
  15. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条
  16. commons fileupload的DiskFileItemFactory
  17. Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码
  18. 逻辑思维题一:条件组合覆盖
  19. HTML电子邮件格式的制作与发送
  20. Win10 去掉桌面快捷方式小箭头

热门文章

  1. [mybatis]Getting Started
  2. [Java基础]int和String的相互转换
  3. [Java基础]String对象的特点(易错点)
  4. Pseudoprime numbers POJ - 3641(快速幂+判素数)
  5. bim建筑绘图计算机要求,BIM考试报名条件:想要成为一级BIM建模师需要达到哪些要求?...
  6. python哪个方向工资高_【看完这五大Python就业方向,你选择哪个?】- 环球网校
  7. Deeplab 在Qt Creator下编译报错undefined reference to Mat_xxx
  8. 背包dp的核心思想(动态规划)
  9. CodeForces 1514A Perfectly Imperfect Array
  10. H - Checker FZU - 2041