java IO 中的缓冲区如何工作?

How do buffers work in java IO?

我无法理解缓冲区在 Java IO 中的工作原理。

对不起,如果我没有像我想的那样清楚地表达自己,我不是 擅长所有这些概念。

据我了解,在 Java 中有 readers/writers,对于字符(意思是 每个字符和编码选项超过一个字节的可能性)和流 对于字节。

还有一些class使用缓冲区的。

我觉得主要是为了避免不必要的系统使用buffer 涉及昂贵操作的调用,例如访问速度较慢的设备,通过 在内存中存储更多内容并使系统调用对更多数据有用。

我遇到的问题是 readers/writers 和流似乎都有缓冲 classes。

我想知道缓冲字符是否足够,或者到时候这些字符是否足够 字节到达流 ​​class,它们将被刷新,例如换行符, 正如某些 classes 所述。

我发现的最好的是这个 post

这些不同的代码片段在缓冲方面有何不同? autoflush 会阻碍缓冲的意图吗? 是否应该只有一个缓冲区在播放,如果是,在哪里(编写器或流) 为什么?:

// resolveSocket is some socket

PrintWriter out = new PrintWriter(
    resolveSocket.getOutputStream(),
    true); 

// vs

PrintWriter out = new PrintWriter(
    new OutputStreamWriter(
        new BufferedOutputStream(resolveSocket.getOutputStream()),
        StandardCharsets.UTF_8),
    true)

我的兴趣首先是更好地理解缓冲,然后才是实用。

先谢谢大家

编辑:发现 this 其他有趣且相关的堆栈溢出问题。

还有 this 其他人谈论 BufferedOutputStream。

它可能会帮助您理解写入器和流之间的区别。 OutputStream 是二进制接收器。 Writer 具有字符编码并了解换行符。 OutputStreamWriter 允许您发送字符编码数据,并将其正确转换为二进制以供 OutputStream 使用。您可能想要的是:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(resolveSocket.getOutputStream())));

这将允许您使用 PrintWriter 输出字符,由 BufferedWriter 缓冲,然后由 OutputStreamWriter 转换以供套接字输出流使用。