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 转换以供套接字输出流使用。
我无法理解缓冲区在 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 转换以供套接字输出流使用。