【问题标题】:I/O Character stream: BufferedReader vs printWriter constructionI/O 字符流:BufferedReader vs printWriter 构造
【发布时间】:2019-01-31 00:11:48
【问题描述】:

为什么BufferedReader会这样创建

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))

PrintWriter 可以像这样简单地构造

 PrintWriter pw = new PrintWriter(System.out, true);

BufferedReader 不能直接从System.in 构造,所以它需要InputStreamReader 将字节转换为字符,这是为了使其可读吗?但是PrintWriter 不需要从 char 换回 bytes 为什么会这样,Java 会自动执行它吗?因为对于一台机器来说,一切都是 1 & 0。

【问题讨论】:

    标签: java


    【解决方案1】:

    所以它需要 InputStreamReader 将字节转换为字符,这是为了 让它人类可读?

    不,这是为了性能。检查this 以查看它们之间的区别。

    还有BufferedWriterBufferedReader,它们的功能和构造函数相似。

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufferedWriter = new BufferedWriter(new PrintWriter(System.out));
    

    【讨论】:

      【解决方案2】:

      首先: - 二进制数据:byte[], InputStream, OutputStream; - (Unicode)文本:String, char, Reader, Writer; - 二进制数据有一些编码/字符集并且实际上是文本的桥梁:InputStreamReader, OutputStreamWriter(从/到给定或默认字符集转换)。

      现在考虑:

      • System.inInputStream
      • System.outSystem.err 是从 OutputStream 扩展而来的 PrintStream

      它们被认为是二进制数据,这对于 Unix 来说是非常正常和有用的。但是对于控制台来说不是那么有用。但是PrintStream 可能是设计失误/错误:它支持文本,也用于传递字符集;它是一个一半的 OutputStreamWriter。

      因此,将 PrintStream 视为一个旧的不干净的班级,正在做 OutputStreamWriter + BufferedWriter 所做的事情,但不是 Writer

      BufferedWriter+OutputStreamWriterPrintStream 具有相同的复杂性(尽管被颠倒了)。还可以看到 Scannernew Scanner(System.in)。这不是Reader,并且对标记化有多余的支持。它像PrintStream 一样具有简洁的优点,但由于其不必要的开销而肯定更加不干净。 (在 StackOverflow on Scanner 中提到了相当多的 bug。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多