【问题标题】:Which File reading Writing IO class to use and when?使用哪个文件读取写入 IO 类以及何时使用?
【发布时间】:2015-08-02 18:21:37
【问题描述】:

众所周知,Java 提供了非常复杂的 IO 类列表,此外还有一个叫做 NIO 的东西。

  1. 我想知道是否有任何经验法则可以解释情况以及解决问题的最佳 IO(考虑到 Web 应用程序)。

  2. 我总是很困惑何时使用哪个,另一个问题是我应该如何记住所有这些类的实现。总是让人困惑

【问题讨论】:

  • 我也在找一样的,不过总而言之,在你知道最重要的功能和用法之后你会记得的:)
  • 你的问题的主旨是对的,但你的措辞有点冗长和徘徊。您在下面有答案,但您没有接受任何答案。我会放弃你问题的第二部分。它使您的问题过于宽泛,很容易为 mod 提供关闭它的理由。

标签: java io nio


【解决方案1】:

这并不神秘。

  • RandomAccessFile 当你需要随机访问时(很少见)
  • FileWriter 写文字时
  • FileChannel当你需要蔚来时
  • FileOutputStream 在所有其他情况下。

【讨论】:

    【解决方案2】:

    用于读取的 Java IO:

    FileInputStream 类可以将文件内容作为字节流读取。 FileReader 类可以将文件的内容作为字符流读取。 Java IO API 中的 RandomAccessFile 类允许您随意移动文件并从中读取或写入。

    【讨论】:

      【解决方案3】:

      简答:对可能执行少量并发 I/O 操作的应用程序使用 java.io 类。为可能提供大量并发 I/O 操作的应用程序使用 java.nio 类。

      I/O 操作可以是任何东西,从 TCP 连接到您的 Web 服务器(例如:并发 HTTP 请求),到用于执行文件读取或磁盘搜索的文件系统操作,再到后端的数据库连接。

      使用 java.io 的应用程序具有单个并发 I/O 操作通常会优于使用 java.nio 的应用程序。

      在具有大量并发 I/O 操作的服务器中,java.nio 允许在客户端之间有效地交错 I/O。它还可以通过减少线程数量以及内存和上下文切换开销来更有效地使用资源。

      鉴于 java.nio 类的事件性质,其 API 更加复杂。

      在 Web 应用程序中,您应该检查您的容器(Tomcat、Jetty 等)或您的 Web 框架(Play、JSF 等)是否具有处理文件的 API。来自 Web 应用程序的非托管文件 I/O 可能会引入额外的安全漏洞。

      Tomcat 允许您切换到 NIO 后端(如果您直接编写响应流,请注意可能的行为更改,例如压缩和 content-lengrh): https://tomcat.apache.org/tomcat-8.0-doc/aio.html

      【讨论】:

      • 你有这个从前到后。 NIO 使得减少线程数成为可能。这并不是真正的单线程 Java 应用程序,但使用 java.io 和 java.net 构建的服务器肯定是多线程的,并且将使用比使用 java.nio 构建的更多线程.
      • 好点。我希望我在编辑中解决了您的疑虑。
      【解决方案4】:

      IO 与 NIO 的区别:

      +-------------------------------------------------------+-------------------------------------------------------------------+
      |                          IO                           |                            NIO(New IO)                            |
      +-------------------------------------------------------+-------------------------------------------------------------------+
      | Stream oriented                                       | Channels/Buffers oriented                                         |
      | Thread Blocking IO(Synchronous)                       | Non Thread blocking IO(Asynchronous i.e notification based)       |
      | Read or Write can do one byte/char at a time.         | Channel is bidirectional.                                         |
      | Readers are for read only, Writers are for write only | Channel can read and write byte buffer(not char buffer).          |
      | Buffer creates in JVM heap memory.                    | Buffer can be outside or in-memory of JVM.                        |
      | Charset is limited ot UTF-8.                          | Charset support expanded to UTF-16 and more.                      |
      |                                                       | "Selectors" allows a single thread to handle multiple Channel's.) |
      +-------------------------------------------------------+-------------------------------------------------------------------+
      
      • java.io 包是在 JDK 1.0 中引入的(1996 年 1 月 23 日)
      • java.nio(NIO 代表非阻塞 I/O)API 是随 J2SE 1.4 引入的(2002 年 2 月 6 日)
      • 提供新文件系统 API 的 NIO 扩展,称为 NIO.2,随 Java SE 7 发布(2011 年 7 月 28 日),它包括 java.nio 下的新子包 java.nio.file

      • 阻塞调用:控制仅在调用完成时返回

      • 非阻塞调用(通常指polling):控制立即返回。

      Enhancements in Java I/O

      【讨论】:

      • 问题是关于文件I/O,没有非阻塞。 Java 中的文件 I/O 和“非阻塞”和“异步”是两个不同的东西,而不是同一个东西的两个名称。 java.io 不限于一次一个字节/字符,或 UTF-8。
      • 而且蔚来没有缓存。
      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多