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中
相关文章
- 从函数中返回多个值的方法
- Vagrant SSH登录后立即执行一个脚本或命令的方法
- 微信h5支付“网站域名ICP备案主体与商户号主体不一致”的解决方法,H5微信支付 授权函下载
- 问题-Delphi7中JSON遍历节点不支持使用IN处理方法?
- MySQL 的 find_in_set 函数使用方法
- CentOs 设置静态IP 方法
- SecureCRT乱码问题解决方法
- 执行make出现“Warning: File `xxx.c' has modification time 2.6e+04 s in the future“警告的解决方法
- Python version 2.7 required, which was not found in the registry解决方法
- 【COCOS2DX-LUA 脚本开发之七】解决( ERROR IN FUNCTION ‘ADDCHILD’. ARGUMENT #2 IS ‘XX’; ‘CCNODE’ EXPECTED. )异常报错的方法
- mysql中You can’t specify target table for update in FROM clause错误解决方法
- 如何利用市场细分方法构建更好的预测模型?
- C#获取当前路径方法
- Python version 2.7 required, which was not found in the registry解决方法
- Open3D 最小二乘拟合平面(方法二)
- Invalid character in the given encoding. Line XX, position XX.解决方法
- Invalid character in the given encoding. Line XX, position XX.解决方法
- SAP CRM WebClient UI控制器方法DETACH_STATIC_OVW_VIEWS的作用
- Invalid character in the given encoding. Line XX, position XX.解决方法
- 成功解决(不可思议的解决方法)UnicodeDecodeError utf-8 codec cant decode byte 0xd2 in position 3484 invalid con
- 成功解决(六种方法大总结)UnicodeDecodeError utf-8 codec cant decode byte 0xd0 in position 3150: invalid con
- DL框架之MXNet :神经网络算法简介之MXNet 常见使用方法总结(神经网络DNN、CNN、RNN算法)之详细攻略(个人使用)
- 全网多种方法解决You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
- 软件工程——理论、方法与实践 之 概述
- memcached解压报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now的解决方法
- Android有关JNI 学习(两)为JNI方法名称,数据类型和方法签名的一些知识
- Android中View绘制流程以及invalidate()等相关方法分析
- Day 12 - 标签图片的方法与实作
- 【卷积神经网络】13、中间层网络的参数归一化方法 | BN / LN / IN / GN
- C#窗体编程(windows forms)禁止窗口最大化,拖拽,鼠标修改窗体大小,无边框的方法