ImputStream源码学习
来源:互联网 发布:软件测试 静态测试 编辑:程序博客网 时间:2024/06/01 12:23
一.概述
是所有字节输入流的超类
二.源码
// jdk7package java.io;/** * 字节输入流的所有类的超类 * @since JDK1.0 */public abstract class InputStream implements Closeable {// 用于确定skip时要使用的最大缓冲区大小。 private static final int MAX_SKIP_BUFFER_SIZE = 2048; /** * 从输入流中读取数据的下一个字节。 * 在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 * * @return 返回下一个字节数据,为0到255范围内的int值 * 如果已经到达流末尾而没有可用的字节,则返回值 -1。 * @exception IOException if an I/O error occurs. */ public abstract int read() throws IOException; /** * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中 * 相当于read(b, 0, b.length) * @param b 存储读入数据的缓冲区 * @return 读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1。 */ public int read(byte b[]) throws IOException { return read(b, 0, b.length); } /** * 将输入流中最多 len 个数据字节读入 byte 数组。 * 尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。 * * @param b 读入数据的缓冲区 * @param off 数据写入缓冲区b[]中的开始下标off * @param len 要读取的最大字节数. * @return 读入缓冲区的总字节数;如果因为已到达流末尾而不再有数据可用,则返回 -1。 */ public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; }// 读取一个字节 int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; } /** * 跳过和丢弃此输入流中数据的 n 个字节。 * 出于各种原因,skip 方法结束时跳过的字节数可能小于该数,也可能为 0 * * @param n 要跳过的字节数 * @return 跳过的实际字节数 */ 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; } /** * 返回可以不受阻塞地从此输入流读取(或跳过)的估计字节数;如果到达输入流末尾,则返回 0。 * 如上传本地文件,通过FileINputStream读取返回文件具体大小 */ public int available() throws IOException { return 0; } /** * 关闭此输入流并释放与该流关联的所有系统资源 * InputStream 的 close 方法不执行任何操作 */ public void close() throws IOException {} /** * 在此输入流中标记当前的位置 * * mark 的常规协定是:如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节, * 并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节。 * 但是,如果在调用 reset 之前从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。 * * mark就像书签一样,用于标记,以后再调用reset时就可以再回到这个mark过的地方。 * mark方法有个参数readlimit,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。 * 比如说mark(10),那么在read()读取10个以内的字符时,reset()操作后可以重新读取已经读出的数据, * 如果已经读取的数据超过10个,那reset()操作后,就不能正确读取以前的数据了,因为此时mark标记已经失效。 * * InputStream 的 mark 方法不执行任何操作。 * * @param readlimit 在标记位置失效前可以读取字节的最大限制 */ public synchronized void mark(int readlimit) {} /** * 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。 * reset 的常规协定是: *如果方法 markSupported 返回 true,那么: *如果创建流以后未调用方法 mark,或最后调用 mark 以后从该流读取的字节数大于最后调用 mark 时的参数,则可能抛出 IOException。 *如果未抛出这样的 IOException,则将该流重新设置为这种状态:最近一次调用 mark 以后(如果未调用过 mark,则从文件开头开始)读取的所有字节将重新提供给 read 方法的后续调用者,后跟任何从调用 reset 时起将作为下一输入数据的字节。 *如果方法 markSupported 返回 false,那么: *对 reset 的调用可能抛出 IOException。 *如果未抛出 IOException,则将该流重新设置为一种固定状态,该状态取决于输入流的特定类型及其创建方式。提供给 read 方法后续调用者的字节取决于特定类型的输入流。 *除了抛出 IOException 之外,类 InputStream 的方法 reset 不执行任何操作。 * */ public synchronized void reset() throws IOException { throw new IOException("mark/reset not supported"); } /** * 测试此输入流是否支持 mark 和 reset 方法。 * 是否支持 mark 和 reset 是特定输入流实例的不变属性。 * InputStream 的 markSupported 方法返回 false。 */ public boolean markSupported() { return false; }}
阅读全文
0 0
- ImputStream源码学习
- 从ImputStream得到string
- 源码学习
- 源码学习
- [源码学习]Tomcat6 源码学习-1
- JDK源码学习(3)-LinkedHashMap源码学习
- [源码学习] -- yii2源码学习笔记(二)
- Struts 源码学习笔记
- Struts 源码学习笔记
- 学习ACE源码
- PicoContainer源码学习
- linux0.11源码学习
- 学习Myfaces源码
- PicoContainer源码学习
- PicoContainer源码学习
- PicoContainer源码学习
- PicoContainer源码学习
- PicoContainer源码学习
- 电压调整率和电流调整率
- C++数组(二维数组)与指针 以及 函数传递/返回指针和数组参数
- Windows18
- Java泛型详解
- Android试题
- ImputStream源码学习
- Windows19
- MATLAB在密码学中的应用
- 一种小数转分数的算法(不限整除)C++
- java面试题
- start bat并行执行dos exe指令
- Scroller解析
- ubuntu实时监视GPU情况
- C语言的数组