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

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的设计者们:请让你们的方法的行为能够清晰的反映在方法名上;请清楚而详细地给出这些行为的文档;请正确地实现这些行为。

Java更多的库谜题81:烧焦到无法识别.doc

下载Word文档到电脑,方便收藏和打印[全文共1322字]

编辑推荐:

下载Word文档

java 81 08,Java更多的库谜题81:烧焦到无法识别相关推荐

  1. 谜题81:烧焦到无法识别

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

  2. Java 8新的时间日期库,这二十个案例看完你还学不会算我的!!!

    Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及 ...

  3. Java 8新的时间日期库的20个使用示例

    Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java ...

  4. 对Java初学者来说,到底Java有哪些高效的开源库?

    我们都知道,Java编程语言具有强大的开源的数据库,这些数据库很大程度上在工作过程中为程序员们提供很大的帮助.但是,对于很多零基础来学Java的新手来说,到底Java有哪些高效的开源库,可以让他们更好 ...

  5. Java 8 新的时间日期库java.time

    Instant--它代表的是时间戳 LocalDate--不包含具体时间的日期,比如 2020-01-14.它可以用来存储生日,周年纪念日,入职日期等. LocalTime--它代表的是不含日期的时间 ...

  6. java mysql多媒体积件管理库的开发与应用源码+论文

    下载地址:https://mp.csdn.net/mp_download/manage/download/UpDetailed 项目介绍 java mysql多媒体积件管理库的开发与应用源码+论文 系 ...

  7. java计算机毕业设计教师招聘考试题库系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计教师招聘考试题库系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计教师招聘考试题库系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构 ...

  8. java毕业设计软考在线题库系统mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计软考在线题库系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计软考在线题库系统mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S ...

  9. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

最新文章

  1. 题目1156:谁是你的潜在朋友
  2. 设计模式复习-中介者模式
  3. Java的二十三种设计模式(原型模式(Prototype))
  4. Hive的基本操作-创建内部表
  5. MS CRM 2011 C#中获取Web Resource
  6. “猜心思”的Hard模式:问答系统在智能法律场景的实践与优化
  7. 一笔画问题(信息学奥赛一本通-T1341)
  8. HTML代码transform,html-transform+onmouseover代码实例
  9. java设计一个立方体类box_实例1: 设计一个立方体类Box,定义三个属性,分别是长,宽,高。定义二个方法,分别计算并输出立方体的体积和表面积。_学小易找答案...
  10. 【JavaScript】JavaScript闭包
  11. [转载]用户(User)和用户组(Grou…
  12. Android系统如何录制屏幕(录制成mp4格式)
  13. 基于STM32-ESP8266-阿里云-微信小程序的智慧舒适家庭控制系统项目
  14. 美国的人民币汇率谋略
  15. 今日头条小程序是什么
  16. python新版个人所得税代码_python-计算个人所得税(示例代码)
  17. cousera课程 Introduction to Programming with MATLAB 范德堡大学 作业1
  18. 教你使用Box2d制作用蜡笔手绘物体的效果(一)
  19. Gitlab 可以push但web端不显示文件
  20. 【CCF会议期刊推荐】中国计算机协会(CCF)推荐计算领域高质量科技期刊分级目录(T2类)

热门文章

  1. AE开发中关于 “无法嵌入互操作类型.........请改用适用的接口”问题的解决方法...
  2. 浅谈SQL Server数据库分页
  3. .NET实现之(自动更新)
  4. MVC 3.0 Html.ActionLink
  5. Go的string/int/int64转化
  6. layui获取checkbox选中值_小程序之十二 获取多选按钮数值及后续想法
  7. 用java编写打印时间_编写一个java程序,读取系统时间,然后将时间用中文输出...
  8. mysql批量更新查询结果_数据库批量查询结果作为更新的值
  9. android cpu hotplug,[MTK] [CPU DVFS/Hotplug]运行时,把CPU固定在特定频率/特定核数的办法...
  10. 密度图的密度估计_基于核密度的宝鸡地名文化特征与时空分布研究