为什么BufferedReader
这样创建
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
虽然PrintWriter
可以像这样简单地构造
PrintWriter pw = new PrintWriter(System.out, true);
BufferedReader
不能直接从System.in
构造,因此需要InputStreamReader
才能将字节转换为字符,这是为了使它易于人类阅读吗?但是PrintWriter
不需要从字符包装回字节,为什么会这样,Java 会自动化它吗?因为对于机器来说,一切都是1和0。
所以它需要InputStreamReader将字节转换为字符,这是为了 让它人性化可读?
不,这是为了性能。检查一下以查看它们之间的区别。
还有BufferedWriter
和BufferedReader
,它们具有相似的函数和构造函数。
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new PrintWriter(System.out));
首先: - 二进制数据:byte[], InputStream, OutputStream
; - (统一码(文本:String, char, Reader, Writer
; - 二进制数据具有一些编码/字符集并且实际上是文本的桥:InputStreamReader, OutputStreamWriter
(从/转换为给定或默认字符集(。
现在考虑:
System.in
是一个InputStream
.System.out
和System.err
是从OutputStream
延伸出来的PrintStream
。
它们被认为是二进制数据,这对于Unix来说是非常正常和有用的。然而,对于控制台来说不是那么有用。然而PrintStream
可能是设计错误/错误:它有文本支持,也用于传递字符集;它是一个半OutputStreamWriter。
因此,
PrintStream
视为一个旧的不洁类,做OutputStreamWriter + BufferedWriter
所做的事情,但不是Writer
。
BufferedWriter+OutputStreamWriter
具有与PrintStream
相同的复杂性(尽管被颠倒了(。人们还看到扫描仪:new Scanner(System.in)
。这不是一个Reader
,并且对标记化有多余的支持。它像PrintStream
一样具有简短的优点,但对于其不必要的开销来说,它肯定更不干净。(在StackOverflow on Scanner中提到了很多错误。