对于经常写入std out或err的PrintStream,这些流可能已关闭或被丢弃,但您不希望程序因此意外失败。
PrintWriter在许多方面都是PrintStream的Writer版本,尽管我不确定重复PrintStream的错误是否是一个好主意。;)
PrintWriter不报告IOException的事实使其成为向套接字写入文本的较差选择,因为您经常需要知道连接是否已失败。
我认为主要是因为System.err是一个PrintStream。
当你在catch块中处理异常时,调用e.printStackTrace()是很常见的,它会写入System.err。如果该调用抛出异常,你将失去原始异常,并从你的代码中得到PrintStream错误。然后你需要在catch块内部再加一个try/catch来防止这个问题,这会造成很大的混乱。
请注意,JDK 1.7解决了从catch块中抛出异常的问题,并允许你访问两个异常。