下面这个程序看起来是在用一种特殊的方法做一件普通的事。那么,它会打印出
什么呢?

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:烧焦到无法识别相关推荐

  1. java 81 08,Java更多的库谜题81:烧焦到无法识别

    下面这个程序看起来是在用一种特殊的方法做一件普通的事.那么,它会打印出什么呢? public class Greeter{ public static void main(String[] args) ...

  2. 一辆特斯拉Model S在比利时充电时起火 充电桩也被烧焦

    6月3日,据国外媒体报道,在去年特斯拉电动汽车所卷入的车祸中,涉事的特斯拉电动汽车在剧烈碰撞之后大多都迅速起火,造成多人死亡,但在今年,特斯拉电动汽车在未发生车祸等碰撞的情况下也多次起火,从4月份上海 ...

  3. 美国Ivanpah太阳能发电站:飞经这里的鸟都被烧焦了

    上周,美国加利福尼亚的伊万帕(Ivanpah)塔式太阳能光热发电站上线.这个发电站虽然才刚刚上线,不过技术上已经是旧式的了,发电站背后基于支持的企业则已经在考虑对设备设施进行升级. 发电站周围有大量反 ...

  4. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  5. 计算机硬件故障照片,计算机硬件故障的识别与处理

    摘要:我国已步入了一个网络化时代,计算机在我们日常生活中广泛的应用,人们对于所使用的计算机的相关要求更为严格,使得计算机硬件方面的技术在逐步提高.在计算机运行过程中,由于诸多因素的存在可能导致计算机故 ...

  6. 一个劣质24V电源引发的悲剧:主板南桥烧了

    作者:YJGQDD(阿莫论坛ID:hailing),整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 今天下午使用一个24伏电源给我的FF-BASIC-DEMO开发板供电,开发板连US ...

  7. 判断计算机硬件和网络故障,计算机硬件故障的识别与处理

    计算机硬件故障的识别与处理 摘要:我国已步入了一个网络化时代,计算机在我们日常生活中广泛的应用,人们对于所使用的计算机的相关要求更为严格,使得计算机硬件方面的技术在逐步提高.在计算机运行过程中,由于诸 ...

  8. DeFi 生态大溃败:“寿司”,糊了;“三文鱼”,焦了

    文 | 棘轮 林格 2020年,DeFi一直是币圈的头号热点. 自今年6月以来,流动性挖矿彻底引爆了DeFi生态.从Compound到此后的YFI,DeFi矿工们收获颇丰. 但近期,多个DeFi项目却 ...

  9. 鸡蛋煎的好不好?Mask R-CNN帮你一键识别

    翻译 | 王柯凝 编辑 | Just 出品 | 人工智能头条(公众号ID:AI_Thinker) ▌介绍 关于卷积神经网络从交通灯识别到更实际的应用,我经常听到这样一个问题:"会否出现一种深 ...

最新文章

  1. 【C++】google glog详解
  2. JAVA JDK老版本删除不彻底,环境变量设置无效,如何彻底卸载JAVA环境?
  3. C# 中Bitmap图像处理含增强对比度的三种方法
  4. 大陆居民身份证验证方法(java)
  5. java学习(173):class反射编程方法
  6. 15 SD配置-企业结构-分配-给工厂分配起运点
  7. Java项目之家庭记账软件
  8. 如何解决Win10预览版一闪而过的disksnapshot.exe进程?
  9. List 、Set、 Map有什么区别和联系
  10. [Asp.net]Calendar+JqueryUi实现日程管理(右键菜单,添加,编辑,删除,源码)
  11. 关于微信服务商统一下单需要注意的几个问题
  12. Facebook最新研究:全局一致的视频深度估计
  13. win10照片不能下一张的解决办法
  14. 语音识别的概念和前世今生
  15. cocos2dx 组件
  16. ECCV 2018 paper
  17. 算数操作符与移位操作符
  18. 基于Java毕业设计在校大学生健康状况信息管理系统源码+系统+mysql+lw文档+部署软件
  19. 计算机软考网络工程师 查询,计算机软考网络工程师考试成绩查询指南
  20. Quorum (分布式系统)

热门文章

  1. HDU 3466 01背包变形
  2. 浅谈RAID写惩罚(Write Penalty)与IOPS计算
  3. Quasar Akka Vertx Norbert 比较
  4. 2015年10月15日作业
  5. mac下的抓包工具Charles
  6. hello first one
  7. 调试coffee script 的一个技巧
  8. linux开启远程访问端口
  9. 使用express搭建第一个Web应用【Node.js初学】
  10. 从u盘设备启动arc-livecd