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','\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()方法的更多相关文章
- Java中 System.arraycopy() 和 Arrays.copyOf()方法
System.arraycopy() 和 Arrays.copyOf()方法 阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法.比如:我们上面讲的扩容操作以及add(int in ...
- 通过实现System.IComparable接口的CompareTo方法对两个类进行比较
假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...
- C#中DataTable中的Compute方法使用收集
原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- Request中的各种方法
前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- C#中==与Equals方法的区别
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- TextView和EditText中的setFilters方法说明
在TextView中有一个方法public void setFilters(InputFilter[] filters),API中有一句说明:Sets the list of input filter ...
随机推荐
- js加强小结
一)回顾JavaScript基础 (1)函数的定义方式 *>>正常方式 function add(num1,num2){...} >>构造器方式 var add = new F ...
- window下虚拟环境搭建
1.找到你的host文件
- Python zfill() 方法
描述 Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0. 语法 zfill()方法语法: S.zfill(width) 参数 width -- 指定字符串的长度.原字 ...
- 会话过程保存数据对象cookie和session
1 cookie是以键值对保存在浏览器端,服务器端可以创建.接收.发送 cookie 信息. request可以接收 cookie, response 可以发送 cookie. 1)cookie 可以 ...
- 如果你写PHP, 请多注意自己是否有良好的习惯
如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. $row['id'] 的速度是$row[id]的7倍. echo 比 print 快,并且使用echo的多重参数 ...
- dataGridViewX操作
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) { ...
- spring oauth2相关资料
理解OAuth 2.0 *****http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html Secure REST API with oauth2 ...
- 从“空项目”创建MFC项目遇到的问题error C1189,error MSB8031
在VS2013中创建了一个空项目,创建了MyApp.h, MyApp.cpp(MyApp.h使用了<afxwin.h>) build的时候报错: fatal error C1189: #e ...
- C# TextBox常用方法总结
我们在使用C# TextBox进行开发操作的时候经常会碰到C# TextBox的使用,那么C# TextBox的使用有没有一些常用的技巧呢?如C# TextBox换行的处理,其实就是一些常用的操作,那 ...
- excel鼠标拖选慢shift选择快的问题
今天遇到个惊天大坑,关于excel的,最近,一直在调查这个东西,刚开始真的是毫无头绪,反正现在就是excel的值的copy会偶尔慢,慢的情况也是不明白,就是稀里糊涂的调查. 刚开始连100%再现这个b ...