谜题81:烧焦到无法识别
下面这个程序看起来是在用一种特殊的方法做一件普通的事。那么,它会打印出
什么呢?
public class Greeter{
public static void main(String[] args){
String greeting = "Hello World";
for(int i = 0; i < greeting.length(); i++)
System.out.write(greeting.charAt(i));
}
}
尽管这个程序有点奇怪,但是我们没有理由怀疑它会产生不正确的行为。它将
“Hello World”写入了 System.out,每次写一个字符。你可能会意识到 write
方法只会使用其输入参数的低位字节(lower-order byte)。所以当“Hello
World”含有任何外来字符的时候,可能会造成一些麻烦,但这里不会:因为
“Hello World”完全是由 ASCII 字符组成的。无论你是每次打印一个字符,还
是一次全部打印,结果都应该是一样的:这个程序应该打印 Hello World。然而,
如果你运行该程序,就会发现它不会打印任何东西。那句问候语到哪里去了?难
道是程序认为它并不令人愉快?
这里的问题在于 System.out 是带有缓冲的。Hello World 中的字符被写入了
System.out 的缓冲区,但是缓冲区从来都没有被刷新(flush)。大多数的程序
员认为,当有输出产生的时候 System.out 和 System.err 会自动地进行刷新,这
并不完全正确。这 2 个流都属于 PrintStream 类型,在 5.0 版[Java-API]中,有
关这个类型的文档叙述道:
一个 PrintStream 可以被创建为自动刷新的;这意味着当一个字节数组(byte
array)被写入,或者某个 println 方法被调用,或者一个换行字符或字节(‘\n’)
被写入之后,PrintStream 类型的 flush 方法就会被自动地调用。
System.out 和 System.err 所引用的流确实是 PrintStream 的能够自动刷新的变
体,但是上面的文档中并没有提及 write(int)方法。有关 write(int)方法的文
档叙述道:将指定的 byte 写入流。如果这个 byte 是一个换行字符,并且流可以
自动刷新,那么 flush 方法将被调用[Java-API]。实际上,write(int)是唯一一
个在自动刷新(automatic flushing)功能开启的情况下不刷新PrintStream的输
出方法(output method)。
令人好奇的是,如果这个程序改用 print(char)去替代 write(int),它就会刷新
System.out 并打印出 Hello World。这种行为与 print(char)的文档是矛盾的,
因为其文档叙述道[Java-API]:
打印一个字符:这个字符将根据平台缺省的字符编码方式被翻译成为一个或多个
字节,并且这些字节将完全按照 write(int)方法的方式被写出。
类似地,如果程序改用 print(String),它也会对流进行刷新,虽然文档中是禁
止这么做的。相应的文档确实应该被修改为描述该方法的实际行为,而修改方法
的行为则会破坏稳定性。
修改这个程序最简单的方法就是在循环之后加上一个对 System.out.flush 方法
的调用。经过这样的修改之后,程序就会正常地打印出 Hello World。当然,更
好的办法是重写这个程序,使用我们更熟悉的 System.out.println 方法在控制
台上产生输出。
这个谜题的教训与谜题 23 一样:尽可能使用熟悉的惯用法;如果你不得不使用
陌生的 API,请一定要参考相关的文档。这里有 3 条教训给 API 的设计者们:请
让你们的方法的行为能够清晰的反映在方法名上;请清楚而详细地给出这些行为
的文档;请正确地实现这些行为。
转载于:https://www.cnblogs.com/yuyu666/p/9841027.html
谜题81:烧焦到无法识别相关推荐
- java 81 08,Java更多的库谜题81:烧焦到无法识别
下面这个程序看起来是在用一种特殊的方法做一件普通的事.那么,它会打印出什么呢? public class Greeter{ public static void main(String[] args) ...
- 一辆特斯拉Model S在比利时充电时起火 充电桩也被烧焦
6月3日,据国外媒体报道,在去年特斯拉电动汽车所卷入的车祸中,涉事的特斯拉电动汽车在剧烈碰撞之后大多都迅速起火,造成多人死亡,但在今年,特斯拉电动汽车在未发生车祸等碰撞的情况下也多次起火,从4月份上海 ...
- 美国Ivanpah太阳能发电站:飞经这里的鸟都被烧焦了
上周,美国加利福尼亚的伊万帕(Ivanpah)塔式太阳能光热发电站上线.这个发电站虽然才刚刚上线,不过技术上已经是旧式的了,发电站背后基于支持的企业则已经在考虑对设备设施进行升级. 发电站周围有大量反 ...
- Java解惑 电子书
--表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...
- 计算机硬件故障照片,计算机硬件故障的识别与处理
摘要:我国已步入了一个网络化时代,计算机在我们日常生活中广泛的应用,人们对于所使用的计算机的相关要求更为严格,使得计算机硬件方面的技术在逐步提高.在计算机运行过程中,由于诸多因素的存在可能导致计算机故 ...
- 一个劣质24V电源引发的悲剧:主板南桥烧了
作者:YJGQDD(阿莫论坛ID:hailing),整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 今天下午使用一个24伏电源给我的FF-BASIC-DEMO开发板供电,开发板连US ...
- 判断计算机硬件和网络故障,计算机硬件故障的识别与处理
计算机硬件故障的识别与处理 摘要:我国已步入了一个网络化时代,计算机在我们日常生活中广泛的应用,人们对于所使用的计算机的相关要求更为严格,使得计算机硬件方面的技术在逐步提高.在计算机运行过程中,由于诸 ...
- DeFi 生态大溃败:“寿司”,糊了;“三文鱼”,焦了
文 | 棘轮 林格 2020年,DeFi一直是币圈的头号热点. 自今年6月以来,流动性挖矿彻底引爆了DeFi生态.从Compound到此后的YFI,DeFi矿工们收获颇丰. 但近期,多个DeFi项目却 ...
- 鸡蛋煎的好不好?Mask R-CNN帮你一键识别
翻译 | 王柯凝 编辑 | Just 出品 | 人工智能头条(公众号ID:AI_Thinker) ▌介绍 关于卷积神经网络从交通灯识别到更实际的应用,我经常听到这样一个问题:"会否出现一种深 ...
最新文章
- 【C++】google glog详解
- JAVA JDK老版本删除不彻底,环境变量设置无效,如何彻底卸载JAVA环境?
- C# 中Bitmap图像处理含增强对比度的三种方法
- 大陆居民身份证验证方法(java)
- java学习(173):class反射编程方法
- 15 SD配置-企业结构-分配-给工厂分配起运点
- Java项目之家庭记账软件
- 如何解决Win10预览版一闪而过的disksnapshot.exe进程?
- List 、Set、 Map有什么区别和联系
- [Asp.net]Calendar+JqueryUi实现日程管理(右键菜单,添加,编辑,删除,源码)
- 关于微信服务商统一下单需要注意的几个问题
- Facebook最新研究:全局一致的视频深度估计
- win10照片不能下一张的解决办法
- 语音识别的概念和前世今生
- cocos2dx 组件
- ECCV 2018 paper
- 算数操作符与移位操作符
- 基于Java毕业设计在校大学生健康状况信息管理系统源码+系统+mysql+lw文档+部署软件
- 计算机软考网络工程师 查询,计算机软考网络工程师考试成绩查询指南
- Quorum (分布式系统)