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中






  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6721946.html
Copyright © 2011-2022 走看看