Java IO(二) 之 InputStream

源码均以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修饰的,所以其并不具有实例化的能力,要完全借助于其子类实现对于流的各种操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 01:08:04

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

java IO(二):字节流(InputStream和OutputStream)

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

java IO之输入流——InputStream

java的基本输入流是java.io.InputStream,该抽象类定义了输入流的基本输入操作方法,实现自该抽象类的子类都有定义自己的数据源,例如ByteArrayInputStream的构造函数指定了ByteArrayInputStream输入流的数据源必须是一个字符数组.这就可以有多种不同的数据源,包括:字符数组.String对象.文件."管道".一个由其他种类的流组成的序列... 1 public ByteArrayInputStream(byte buf[]) {} 2 3

图解 Java IO : 二、FilenameFilter源码

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 从上一篇 图解 Java IO : 一.File源码 并没有把所有File的东西讲完.这次讲讲FilenameFilter,关于过滤器文件<Think In Java>中写道: 更具体地说,这是一个策略模式的例子,因为list()实现了基本功能,而按着形式提供了这个策略,完

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

RandomAccessFile: 翻译过来就是任意修改文件,可以从文件的任意位置进行修改,迅雷的下载就是通过多个线程同时读取下载文件.例如,把一个文件分为四 部分,四个线程同时下载,最后进行内容拼接 public class RandomAccessFile implements DataOutput, DataInput, Closeable { public RandomAccessFile(String name, String mode); public RandomAccessFil

Java IO流(二)

目录 Java IO流(二) 7. 字节缓冲流 7.1 概述 7.2 BufferedOutputStream类 7.3 BufferedInputStream类 8. 文件复制练习(增强版 使用缓冲流) 9. 字符缓冲流 9.1 BufferedWriter类 9.2 BufferedReader类 10. 练习:文本排序 11. 转换流 11.1 字符编码和字符集 11.2 编码引出的问题 11.3 转换流的原理 11.4 OutputStreamWriter类 11.5 InputStre

ava.io.InputStream &amp; java.io.FileInputStream

java.io.InputStream & java.io.FileInputStream java.io.InputStream,这个抽象类是表示字节输入流的超类,这个抽象类的共性的方法有: 方法 作用 int read() 从输入流中读取数据的下一个字节,并返回,到末尾就返回-1 int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b之中 void close() 关闭输入流,并释放与输入流相关的系统资源 java.io.FileInputStream

Java IO学习笔记(一)

一.概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.在两设备间的传输的数据称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,以进行数据操作. 二.流分类 数据类型:字符流和字节流 流方向:输入流和输出流 字节流和字符流区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节. 处理对象不同:字节流能处理所有类型的数据(如图片.rmvb等),字符流只能处理字符类型的数据. 处理纯文本数据,优先使用字符流,此

黑马程序员——Java基础---IO(二)---IO字节流、流操作规律

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------   字节流 一.概述 1.字节流和字符流的基本操作是相同的,但字节流还可以操作其他媒体文件. 2.由于媒体文件数据中都是以字节存储的,所以,字节流对象可直接对媒体文件的数据写入到文件中,而可以不用再进行刷流动作. 3.读写字节流:Inpu

java IO文件读写例子(OutputStream,InputStream,Writer,Reader)

一,File创建文件 File file = new File("D:" + File.separator + "yi.txt"); 代码示例: package com.hbut.io; import java.io.File; import java.io.IOException; public class FileDemo { public static void main(String[] args) { File file = new File("