源代码均以JDK1.8作为參考

前言:

InputStream实现了两个接口Closeable和AutoCloseable:



Closeable:JDK1.5中引入,Closeable接口中仅仅有一个close()方法的定义:

public void close() throws IOException;

实现了Closeable接口的类的对象能够被关闭,流类都实现了该接口,以达到关闭流的目的。

AutoCloseable:JDK1.7中引入,为JDK1.7中引入的带资源的try语句提供了支持。try能够自己主动关闭资源。

AutoCloseable接口亦仅仅定义了一个close()方法的定义:

void close() throws Exception;

仅仅有实现了AutoCloseable接口的类的对象才干够使用带资源的try语句进行管理。在JDK1.7中Closeable继承了AutoCloseable接口,所以IO包下的流类都能够使用带资源的try语句进行管理。

源代码分析:

InputStream是相对于Java本身来说的,从其它途径向内读取数据,所以叫输入流。

InputStream是一个抽象类。是java.io流字节流的基类。

InputStream中定义了一系列方法。

主要方法:

1.public abstract int read():

从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。假设由于已经到达流末尾而没有可用的字节。则返回值 -1。

在输入数据可用、检測到流末尾或者抛出异常前。此方法一直堵塞。

子类必须提供此方法的一个实现。

2.public int read(byte b[]):

从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。

3.public int read(byte b[], int off, int len):

将输入流中最多 len 个数据字节读入 byte(从byte数组的off索引開始读入) 数组。

尝试读取 len 个字节,但读取的字节也可能小于该值。

以整数形式返回实际读取的字节数。

注:对于InputStream中的2和3方法,事实上现都是依赖1方法来实现的,通过1方法获取单个字节,读入2和3中指定的缓冲数组中。

4. public long skip(long n):

在输入流中跳过指定字节数的读取。跳过的字节数为n,可是InputStream定义了skip的最大长度MAX_SKIP_BUFFER_SIZE=2048,n超过这个值。将仅仅跳过MAX_SKIP_BUFFER_SIZE个字节的读取。源代码例如以下:

public long skip(long n) throws IOException {
long remaining = n;
int nr; if (n <= 0) {
return 0;
}
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
byte[] skipBuffer = new byte[size];
while (remaining > 0) {
nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;
}

相同基于read系列重载方法实现,原理就是直接讲指定个数的字节读取。可是不进行保留,以完毕skip操作。

5. public int available():

返回该InputStream在不被堵塞的情况下下一次能够读到的数据长度。

6. public void close():

关闭InputStream流

7. public synchronized void mark(int readlimit):

标记InputStream流中的某一个位置,由其子类进行详细实现。

8. public synchronized void reset():

将此流又一次定位到最后一次对此输入流调用 mark 方法时的位置。

9. public boolean markSupported():

检查此流是否支持详细实现了public synchronized void mark(int readlimit)方法。

总: InputStream在一定程度上对输入流做了一个抽象。定义了输入流的基本职责,可是并不提供详细的实现。仅仅是做简单的约束。并不是强制重写,由于InputStream是abstract修饰的,所以其并不具有实例化的能力,要全然借助于其子类实现对于流的各种操作。

Java IO(二) 之 InputStream的更多相关文章

  1. 图解 Java IO : 二、FilenameFilter源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  2. Java IO(二)

    字节流 字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream B ...

  3. java IO(二):字节流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 系统学习 Java IO (二)----IO 异常处理

    目录:系统学习 Java IO---- 目录,概览 我们使用流后,需要正确关闭 Streams 和 Readers / Writers . 这是通过调用 close() 方法完成的,看看下面这段代码: ...

  5. Java IO:为什么InputStream只能读一次

    http://zhangbo-peipei-163-com.iteye.com/blog/2021879 InputStream的接口规范就是这么设计的. /** * Reads the next b ...

  6. Java IO(二)--RandomAccessFile基本使用

    RandomAccessFile: 翻译过来就是任意修改文件,可以从文件的任意位置进行修改,迅雷的下载就是通过多个线程同时读取下载文件.例如,把一个文件分为四 部分,四个线程同时下载,最后进行内容拼接 ...

  7. ava.io.InputStream & java.io.FileInputStream

    java.io.InputStream & java.io.FileInputStream java.io.InputStream,这个抽象类是表示字节输入流的超类,这个抽象类的共性的方法有: ...

  8. Java IO流(二)

    目录 字节缓冲流 概述 BufferedOutputStream类 继承父类的共性成员方法 构造方法 BufferedInputStream类 继承自父类的方法: 构造方法 文件复制练习(增强版 使用 ...

  9. Java IO学习笔记(一)

    一.概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.在两设备间的传输的数据称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,以进行数据操作. 二.流分类 数据类型 ...

随机推荐

  1. HDU 4320 Contest 3

    只需A的全部质因数包含在B中即可. #include <iostream> #include <cstdio> #define LL __int64 #include < ...

  2. Android Material Design-Getting Started(入门)-(一)

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/40400343 翻译自:http://developer.android.com/trainin ...

  3. 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)

    为了让自己更像一个前端project师,决定从开发环境開始武装自己. 本文将介绍前段project师开发的一些利器的安装步骤,主要包含了: 1.Node.js的安装 2.Grunt的安装及经常使用插件 ...

  4. 怎样利用JDBC连接并操作Oracle数据库

    之前学习.NET的时候.以前利用ODBC进行连接数据库,而在Java中通常採用JDBC连接数据库,这里以oracle数据库为例简单的总结一下利用JDBC怎样连接并操作数据库. 1.连接 public ...

  5. 深入分析Java中的I/O类的特征及适用场合

    Java中有40多个与输入输出有关的类.假设不理清它们之间的关系.就不能灵活地运用它们. 假设从流的流向来分,可分为输入流和输出流,而输入流和输出流又都可分为字节流和字符流.因而可将Java中的I/O ...

  6. 去除iframe滚动条

    主页面的IFRAME中添加:scrolling="yes" 子页面程序代码: 让竖条消失: <body style='overflow:scroll;overflow-x:a ...

  7. nyoj--27--水池数目(dfs)

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

  8. linux怎么开启telnet服务

    1>编辑telent的配置文件/etc/xinetd.d/telnet 如下: (设置disable = no,也就是开启telnet服务) service telnet { disable = ...

  9. BZOJ 4260 trie树

    思路: 搞一个前缀异或和 一次从左往右 另一次从右往左 异或最大值 用字典树搞一搞 //By SiriusRen #include <cstdio> #include <cstrin ...

  10. 记我安装Caffe的血泪史(2)

    不知不觉居然花了一个星期来安装Caffe...真是醉了. 接上一篇blog,本以为编译完cuda,opencv之后问题就差不多了(其实本来是没有什么问题的,但硬是被我搞了一堆事情出来....) 出于对 ...