【问题标题】:How do buffers work in java IO?缓冲区在 java IO 中是如何工作的?
【发布时间】:2015-04-24 02:05:13
【问题描述】:

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

如果我表达的不够清楚,请原谅,我不是 擅长所有这些概念。

据我所知,在 Java 中,对于字符(意味着 每个字符和编码选项可能超过一个字节)和流 字节。

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

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

我遇到的问题是,似乎有用于读取器/写入器和流的缓冲类。

我想知道缓冲字符是否足够,或者到时候那些 字节到达流类,它们将被刷新,例如换行符, 正如一些班级所说的那样。

我发现的最好的就是post

这些不同的代码 sn-ps 在缓冲方面如何比较? 自动刷新是否会阻碍缓冲的意图? 是否应该只有一个缓冲区在播放,如果是,在哪里(写入器或流) 为什么?:

// 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。

【问题讨论】:

  • 那么,你为什么要标记C
  • @SouravGhosh 因为几乎所有东西都是用 C 实现的,而 C 人可能更了解缓冲和系统调用,所以我想他们可能会对这个问题感兴趣。
  • 我把C标签改成了JVM,这样可能更有意义

标签: java io stream operating-system jvm


【解决方案1】:

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

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

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

【讨论】:

  • BufferedWriter 缓冲字符(我认为)。我仍然有点迷茫,因为在 PrintWriter 中似乎有某种字符缓冲。但主要是 BufferedOutputStream 用于缓冲字节,或者也可以?这些比较如何?
  • 通常缓冲靠近您实际插入字符的对象是最好的。 PrintWriter 可能有一些缓冲以启用正确格式化数据。 Java API 仍然建议使用缓冲包装器:docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html
  • 嗨,兰迪。您能否解释一下为什么“在您实际插入字符的对象附近进行缓冲是最好的”?什么更接近物体?谢谢。
  • 尽快开始缓冲似乎是最有效的。在我的答案示例中,BufferedWriter 是 PrintWriter 的直接代表,而不是等到 OutputStreamWriter 之后添加 BufferedOutputStream。 Java API 文档似乎支持我:docs.oracle.com/javase/7/docs/api/java/io/…
  • 在进一步考虑之后,在任何“收缩点”之前有一个缓冲类可能会更好,所以一个在 OutputStreamWriter 之前,一个在 SocketOutputStream 之前。这样缓冲区可以直接作用于立即委托的类。
猜你喜欢
  • 2014-09-12
  • 2020-11-22
  • 1970-01-01
  • 2011-10-18
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2017-09-02
相关资源
最近更新 更多