zoukankan      html  css  js  c++  java
  • System.in中的read()方法

    大家先来看例如以下这个程序

    public class TestInputStream {
    	public static void main(String args[]) throws IOException {
    		InputStream in = System.in;
    		int a = in.read();
    		System.out.println(a);
    		a = in.read();
    		System.out.println(a);
    		a = in.read();
    		System.out.println(a);
    	}
    }
    问题一:假设输入”a“,那么会输出什么呢?

    其实我输入“a”,它并没有反应

    问题二:假设输入“a”并按下了回车。那么会输出什么呢?

    97 13 10,而且程序结束执行

    问题三:假设仅仅按下回车。那么会输出什么呢?

    13 10。而且程序未结束执行

    问题四:假设输出“abc”。那么会输出什么呢?

    97 98 99

    好了,样例将完了,以下来分析下上面4种情况

    首先我们须要知道System.in究竟是什么?

    直接输出System.in我们能够发现它是一个BufferedInputStream

    那么BufferedInputStream.read()是怎样运作的?

    我们能够粗略的扫一下源代码

        private void fill() throws IOException {
            byte[] buffer = getBufIfOpen();
    	if (markpos < 0)
    	    pos = 0;		/* no mark: throw away the buffer */
    	else if (pos >= buffer.length){	/* no room left in buffer */
    	// 这里是设置了mark之后的操作,不须要关心
    	}
            count = pos;
    	int n = getInIfOpen().read(buffer, pos, buffer.length - pos);
            if (n > 0)
                count = n + pos;
        }

    当中buffer是BufferedInputStream的缓冲区,read(byte[] b, int off, int len)方法是从底层输入流读取数据,该方法为堵塞方法。那么什么时候会返回呢?

    调试进去发现。System.in中底层输入流为FileInputStream。依据官方文档上的描写叙述:

    1、假设 len 不为 0,则在输入可用之前,该方法将堵塞

    2、返回读入缓冲区的字节总数,假设由于已经到达文件末尾而没有很多其它的数据。则返回 -1

    那么对于控制台输入该怎样推断达到“文件末尾”呢?通过回车来提交数据。并告诉程序提交完成。


    以下针对上面的问题一一解答

    1、因为在控制台输入时,按下回车键才代表输入完毕,输入的内容才会提交到read()方法,所以按下回车之前,程序是不知道你输入了什么的

    2、输入"a"后按下回车,这时候read()方法读到了数据,此时buffer中的数据应该是97 13 10,也就是字符'a',' ', ' '。而且read()方法每次仅仅能从缓冲区中读出一个字符,三次read()就刚好读出这3个字符。之后程序就结束了。

    3、仅仅按下回车,此时从流中仅仅读到了" "和" ",因为没有足够的输入。那么第三次调用read()时堵塞

    4、输入"abc",此时从流中读到"a","b","c"," "," "。因为仅仅read()了3次。那么读出abc, 和 仍在buffer中






  • 相关阅读:
    sublime & atom 插件
    正则表达式必知必会读书笔记
    前端自动化工具
    CSS3效果收集
    JS 常用功能收集
    【1】Hover 效果收集
    javascript进阶高手必备知识
    ionic 实现仿苹果手机通讯录搜索功能
    ionic2APP 如何处理返回键问题
    三张图搞懂JavaScript的原型对象与原型链
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6721946.html
Copyright © 2011-2022 走看看