Java IO: InputStream

转载自   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概述文章中介绍过了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检查异常和非检查异常 有空你去学一下检查异常和非检查异常

https://blog.csdn.net/weixin_39220472/article/details/81056647 Java检查异常和非检查异常,运行时异常和非运行时异常的区别 灰太狼_cxh 2018-07-15 20:51:31 7131 收藏 17 展开 通常,Java的异常(包括Exception和Error)分为 检查异常(checked exce…

php 向html追加元素,在PHP中存储兄弟元素的属性和内部HTML

我试图从HTML页面中搜索和存储值,所以我有一个简单的数组数组。它只有2个数组,每个数组有3个项目长。我是这样定义的;这些只是标题:$fileContents array(array(Date, Title, Link));HTML具有以下结构:06/08/2018My Title 这个结构重复几次。我只需要上面的第一个(最新的)。我可…

八幅漫画理解使用JSON Web Token设计单点登录系统

上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录系统。 如果还没有阅读《JSON Web Token - 在Web应用间安全地传递信息》&…

Java IO: OutputStream

转载自 Java IO: OutputStream译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) OutputStream类是Java IO API中所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。参考Java IO概述这一小节底部的表格,可以浏览…

pg和oracle比较,Oracle与PostgreSQL使用差异对比与总结

JDBC连接:Oracle的jdbc连接字符串:db.urljdbc:oracle:thin:192.168.1.1:1521:ORCLPostgresql的连接字符串:db.urljdbc:postgresql:192.168.1.1:5432/database1、基本数据类型差异OraclePostgreSQLVarchar2varcharnumbernumericdatetimestamp/…

hibernate+struts2整合jar包冲突

前几天,在用HibernateStruts2做项目的时候遇到了一个很棘手的问题,jar包冲突!!!先亮一下错误: 之前还不知道这是个啥错误,经过上网查找之后才知道这是jar包冲突的问题!!由…

在ASP.NET Core中实现一个Token base的身份认证

以前在web端的身份认证都是基于Cookie | Session的身份认证, 在没有更多的终端出现之前,这样做也没有什么问题,但在Web API时代,你所需要面对的就不止是浏览器了,还有各种客户端,这样就有了一个问题,这些客…

Java IO: FileInputStream

转载自 Java IO: FileInputStream译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) FileInputStream可以以字节流的形式读取文件内容。FileInputStream是InputStream的子类,这意味着你可以把FileInputStream当做InputStream使用(FileInputStream与…

Java获取指定月份的最后一天

https://blog.csdn.net/itmyhome1990/article/details/85619804 Java获取指定月份的最后一天 麦田 2019-01-02 17:43:38 8036 收藏 1 展开 import java.text.SimpleDateFormat; import java.util.Calendar; public class DUtil { public static String getLastDayOfMon…

php 运算器,运算器的功能是什么

运算器的功能是加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,运算器的处理对象是数据,所以数据长度和计算机数据表明方法,对运算器的性能影响极大。本文操作环境:Window…

同步外部接口数据的一些记录和分享

https://blog.csdn.net/jsnhux/article/details/80116921 https://blog.csdn.net/jsnhux/article/details/80116921 同步外部接口数据的一些记录和分享 灵葱 2018-04-28 10:03:49 2086 收藏 1 展开 1、spring boot之定时器任务 Component public class JobScheduler { pro…

.NET Standard 2.0:整齐划一的目标

在两个月前公布.NET Standard 2.0时,微软认为新版标准的目标在于为现有的三个主要.NET平台:.NET Framework、.NET Core,以及Xamarin提供一个坚实的底层基础,并为未来满足树莓派或IoT等全新类型设备需求可能需要创建的分支提供支持…

vue中路径带# vs 不带#

路由模式有两种 hash:路径带 # 符号,如 http://localhost/#/loginhistory:路径不带 # 符号,如 http://localhost/login 修改路由配置,代码如下: export default new Router({mode: history,routes: [] }…

centos7离线安装oracle11g,CentOS 7.5离线安装Oracle 11gR2

操作系统:CentOS 7.5 64bit,安装方式为gnome Desktop,附加系统工具以及兼容X Window安装包Oracle版本:11gR2Oracle11gR2官方文档链接安装系统建立默认用户的时候建立非oracle的账号。由于是离线安装,使用ssh登录&#…

Java IO: FileOutputStream

转载自 Java IO: FileOutputStream译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) FileOutputStream可以往文件里写入字节流,它是OutputStream的子类,所以你可以像使用OutputStream那样使用FileOutputStream。 这是一个FileOutputStr…

Struts文件上传与下载详解_上传单个文件

大家都知道Servlet上传文件的时候用的是commons-fileupload插件上传的,但是过程极其的麻烦,同样Struts2也有自带的文件上传,但是过程比Servlet里面的简单了不少,接下来请大家看演示: 我们现在先建一个表单用于上传文件…

IP暴露接口IP白名单设置

暴露接口IP白名单设置 暴露接口IP白名单设置 CrazyL- 2018-01-03 14:36:15 4797 收藏 1 展开 String realIp IPUtil.getIpAddr(request); if(!"0:0:0:0:0:0:0:1".equals(realIp)){ List<String> ipList Resources.readLines(Resources.getR…

两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置

为什么要迁移&#xff0c;江湖上传说windows server的稳定性不如某某某&#xff0c;这类议题与八卦新闻没两样&#xff0c;不谈&#xff0c;如果windows的价钱能够和linux相同或者差异不至于那么大&#xff0c;我才懒得换&#xff0c;因为穷&#xff0c;这才是重点。 涉及IO路径…

Vue(笔记)

所有东西必须都在标签里面进行定义&#xff0c;都在div中 报错后不断npm和cnpm Vue简介 Vue (读音/vju/, 类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关…