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

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中

System.in中的read()方法的更多相关文章

  1. Java中 System.arraycopy() 和 Arrays.copyOf()方法

    System.arraycopy() 和 Arrays.copyOf()方法 阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法.比如:我们上面讲的扩容操作以及add(int in ...

  2. 通过实现System.IComparable接口的CompareTo方法对两个类进行比较

    假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...

  3. C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

  4. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  5. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  6. Request中的各种方法

    前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...

  7. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  8. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  9. TextView和EditText中的setFilters方法说明

    在TextView中有一个方法public void setFilters(InputFilter[] filters),API中有一句说明:Sets the list of input filter ...

随机推荐

  1. PHP-密码学算法及其应用-散列函数

    转自http://www.smatrix.org/bbs/simple/index.php?t5591.html /////////////////////////////////////////// ...

  2. [转]C#实现录音录像录屏源码

    原文地址:http://www.cnblogs.com/zhuweisky/p/3593917.html 以前写过两篇录音和录像的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要 ...

  3. [Asp.net]IIS经典和继承模式

    引言 由于要在客户那里部署项目,就研究了一下IIS中的集成和经典模式,这里做一些笔记.希望对您有所帮助. IIS7.0和IIS6.0 IIS7.0的web应用程序有两种配置模式:经典模式和集成模式.经 ...

  4. baidu经纬度坐标与google经纬度坐标都转换

    baidu经纬度坐标与google经纬度坐标都是经过转换的.使用下面那个url可以将原始坐标或者谷歌的坐标转换成baidu的坐标http://api.map.baidu.com/ag/coord/co ...

  5. 类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等

    一.类声明 //类是一种用户自定义类型,声明形式: class 类名称 {    public:              公有成员(外部接口)    private:              私有 ...

  6. jQuery常用方法一览及JQuery选择器获取表格中按钮所在行的其他列值

    Attribute: $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式$(”img”).attr({src:”test.jpg”,alt:”test Image”}); ...

  7. java中GET方式提交和POST方式提交

    java中GET方式提交的示例: /** * 获取关注列表; * @return */ @SuppressWarnings("unchecked") public static A ...

  8. 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩

    现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...

  9. Facebook Oauth2.0 API调用方法

    这些天搞了下Facebook API的东东,在官方网站下弄了一些接口,下面简单的把facebook的调用流程以及常用接口书序一下 :-)  当然在使用facebook api之前要有facebook账 ...

  10. atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模

    atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模 1. 组件结构 1 2. startDraw 开始抽奖流程建模 1 3. 抽奖算法 2 作者:: 老哇的爪子 Attilax 艾龙, ...