我很难理解缓冲区在Java IO中是如何工作的。
对不起,如果我没有像我想的那样清晰地表达自己,我不是在所有这些概念上都很强。
正如我所不理解的,在Java中有读写器,用于chars(意思是每个字符和编码选项可能超过一个字节),以及流字节。
还有一些类使用缓冲区。
我认为使用缓冲区主要是为了避免不必要的系统涉及昂贵操作的呼叫,例如通过在内存中存储更多,并使系统调用对更多数据有用。
我遇到的问题是,似乎有针对读者/作者和流的缓冲类。
我想知道缓冲字符是否足够,或者到那时字节到达流式处理类,它们将在例如换行符上刷新,正如某些类所言。
我发现最好的是这个后
这些不同的代码片段在缓冲方面如何比较?自动刷新是否妨碍了缓冲的意图?是否应该只有一个缓冲区在播放,如果是,在哪里(写入程序或流)为什么?:
// 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)
我的兴趣首先是更好地理解缓冲,并且只有在那之后才实用。
提前告诉你们。
编辑:发现其他堆栈溢出问题有趣且相关。
另外,另一个讨论了BufferedOutputStream。
它可以帮助您理解编写器和流之间的区别。OutputStream是一个二进制接收器。Writer有一个字符编码,并且了解换行符。OutputStreamWriter允许您发送字符编码的数据,并将其正确翻译为二进制数据以供OutputStream使用。你可能想要的是:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(resolveSocket.getOutputStream())));
这将允许您使用PrintWriter输出字符,由BufferedWriter对其进行缓冲,然后由OutputStreamWriter进行翻译以供套接字输出流使用。