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

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','\r', '\n'。而且read()方法每次仅仅能从缓冲区中读出一个字符,三次read()就刚好读出这3个字符。之后程序就结束了。

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

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

最新文章

  1. 实时事件统计项目:优化solr和morphline的时间字段
  2. 《精通C#》第十七章
  3. C# redis使用之ServiceStack
  4. centos6.5分区简易操作
  5. atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
  6. Boostrap(1)
  7. BFS 模板
  8. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (一) 京东 商品搜索
  9. 解决IIS7中出现An error occurred on the server when processing the URL错误提示的方法
  10. C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
  11. __declspec(novtable)keyword
  12. (转载)Linux查看文件编码格式及文件编码转换
  13. Elasticsearch VS Solr
  14. 开始使用 HBuilder 和 Mui - 1 - 分析 index.html ;
  15. LoadRunner学习笔记(三)
  16. andorid UI事件
  17. Linux 用户和用户操作
  18. web.py开发
  19. Vuejs项目的Webpack2构建优化
  20. logback错误日志发送邮件

热门文章

  1. php实现二维数组排序array_multisort($ages, SORT_DESC, $home)函数
  2. XHTML学习书籍
  3. .NET框架- in ,out, ref , paras使用的代码总结 C#中in,out,ref的作用 C#需知--长度可变参数--Params C#中的 具名参数 和 可选参数 DEMO
  4. EMQ学习 ---集群
  5. Spring4.* 中整合 Hibernate
  6. 用sp_lock诊断SQL Sever的死锁问题
  7. unity, inspector listview
  8. Decoration5:引入swagger2进行API管理
  9. linux 流量控制全攻略(TC)
  10. 手把手教做Excel直方图