【Java IO】 二、从InputStream源码说起

此类是一个抽象类,只是对其余继承它的类的一个规范(如 FileInputStream等),并没有具体实现。

来看看它的定义及方法吧

这是该类的定义,其实现了closeable这个接口,简单来说就是定义的这个数据流对象要有一个close方法,来释放该流对象所占用的资源。

public abstract class InputStream implements Closeable
public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

下面是其中重要的抽象方法,子类必须实现

JDK中的注释如下:
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。

public abstract int read() throws IOException;

简单来说,下面的方法就是将调用read()得到的int 值,放入byte数组中
off是从哪开始放,len是放几个。

  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;
        }
//得到下一个字节,如果为-1则表示数据读取完毕返回
        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;
                }
//只要int 值不等于-1且byte数组还有空间,就将值放入。
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
        return i;
    }

还有一个方法,就是将数据放满这个byte数组。

  public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

下面的方法是用来跳过指定的n个字节数,其实就是调用read()方法,读取n个byte,也就相当于是跳过了。

    public long skip(long n) throws IOException {
        //剩余需要跳过的字节数
        long remaining = n;
        int nr;
    
        if (n <= 0) {
            return 0;
        }
        //可跳过的最大值,如n小于这个值,可一次跳过,如大于n,则分多次跳过
        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;
    }

代码小练习:

因为inputStream是抽象类,没办法new (因为方法根本就没实现),所以只能选一个继承了inputStream的子类,就FileInputStream吧。

一。首先新建txt文本:为简单起见,只输入五个字符abcde


}LSOYRKJC3FD2EP66Z6X{UW.png

二。代码如下

 public static void main(String[] args) throws Exception {

        File file = new File("G:\\file\\1.txt");

        InputStream fileInputStream = new FileInputStream(file);
        int i = 0;
        //跳过windows系统自动在txt文件首添加的三个byte
        fileInputStream.skip(3);

        while (true) {
            i = fileInputStream.read();
            if (i == -1) {
                break;
            }
            //输出的是 txt文件的ASCII码,和其对应的字符
            System.out.print(i + ":" + (char) i + " ");
        }
    }

输出为:


1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352