何时使用哪个文件读取写入 IO class?

Which File reading Writing IO class to use and when?

我们都知道 Java 有一个非常复杂的 IO 列表 类 另外还有一个叫做 NIO 的东西。

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

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

简短回答:对可能执行少量并发 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 后端(如果您直接写入响应流,请注意可能的行为变化,例如压缩和内容长度): https://tomcat.apache.org/tomcat-8.0-doc/aio.html

没那么神秘。

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

Java 读取IO:

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

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
  • 阻塞调用:控制returns仅当调用完成

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

Enhancements in Java I/O