JAVA-IO-InputStream解析

Java.io.InputStream类声明了三个基本方法用来把byte数据写入到流中。当然也有用于关闭和刷新的流,查看还有多少数据可以读,略过一些输入,在流中标记一个位置然后重置到那个位置,还有决定标记和重设是否是支持的。

  public abstract int read() throws IOException
  public int read(byte[] data) throws IOException
  public int read(byte[] data, int offset, int length) throws IOException
  public long skip(long n) throws IOException
  public int available() throws IOException
  public void close() throws IOException
  public synchronized void mark(int readLimit)
  public synchronized void reset() throws IOException
  public boolean markSupported()

InputStream中最基本的方法是read,这个方法读入一个无符号的byte类型,然后返回它的整型值。就像大多数的IO方法一样,read方法也会有异常抛出,如果read中无数据可读,你不会受到异常,而是返回-1。用这个作为流结尾的标志。如下的代码展示了如何catch IOException和查看是否为结尾。

    try{
        int[] data = new int[10];
        for(int i=0;i<data.length;i++) {
            int datum = System.in.read();
            if (datum == -1) break;
            data[i] = datum;
        }
    } catch (IOException e ) {
        System.err.println("Couldn't read from System.in!");
    }

read方法等待或者阻塞直到byte数据可用而且准备就绪。Input和Output可能会很慢,所以如果你的程序在执行其他重要的事情。你应该把IO操作放在它们自己的线程当中。下面这个类

public class StreamPrinter {
  InputStream theInput;
  
  public static void main(String[] args) {
    StreamPrinter sr = new StreamPrinter(System.in);
    sr.print();
  }

  public StreamPrinter(InputStream in) {
    theInput = in;
  }
  
  public void print() {
    try{
      while(true) {
        int datum = theInput.read();
        if (datum == -1) break;
        System.out.println(datum);
      }
    } catch (IOException e) {
      System.err.println("couldn't read from system in")
   }
  }
}

第一个read方法读入一批连续数据到byte数组中,第二个尝试读入一定长度的data从offset开始到byte数组。它们两个都不保证读入任意数量的byte。
如果你打算从System.in读入10byte的数据,如下的代码可以完成操作:

  byte[] b = new byte[10];
  System.in.read(b);

但是,并不是每次read都可以拿到你想要的那么多数据。但是这行代码也不能阻止你试图往read中写入超过容量的数据,如果你这么做了,就会导致ArrayIndexOutOfBoundsException.
如下的代码利用循环,确保尽可能多得获得数据:

  byte[] b = new byte[100];
  int offset = 0;
  while(offset <b.length) {
    int bytesRead = System.in.read(b, offset,b.length-offset);
    if(bytesRead==-1) break;
    offset+=bytesRead;
  }

尽管上述的代码可以尽可能多得获取数据,但是并不能规避异常的发生。所以,如果在你尝试读它们之前,你可以知道有多少数据将要被读,这将会非常方便。InputStream中的available方法可以告诉你答案
你可以手动操作代码来忽略掉一部分的数据,但JAVA还是提供了skip方法用来跳过给定byte数的方法

  public long skip(long bytesToSkip) throws IOException

返回值是实际略去的byte数。如果返回-1,则证明剩下的部分都被忽略了。通常来说skip方法比自己手动忽略要快。
并不是所有的流都需要被关闭,比如System.in。但是跟文件或者网络相关的连接还是需要被关闭的。

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

推荐阅读更多精彩内容

  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 952评论 0 1
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,836评论 3 10
  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,023评论 2 95
  • 入夏了,夜里很适合来回走走。喜欢这个季节这个时候的温度。 村里头的路灯开到凌晨一点多,不下雨的天气天上就会冒出很多...
    9f867c0ed88a阅读 162评论 0 0
  • 春兰秋菊各一枝, 常见月季占四时。 更喜天天胜春花, 何忧年年无乐事? 注:后两句化用了【宋】周必大的“莫思乐事年...
    梅心梅飞阅读 479评论 10 14