众所周知,Java提供了非常复杂的IO类列表,另外还有一个名为NIO的东西。
我想知道是否有一些教程/建议可以解释用于解决问题的情况和最佳IO(考虑到Web开发)。
我总是对哪一个使用时感到困惑,另一个查询是我应该如何记住所有这些类的实现。它总是让人感到困惑
PS:我知道这个问题对某些开发人员来说可能听起来很愚蠢,但有问题因为我很好奇,而且我觉得它与收藏,多线程等相比很复杂。
答案 0 :(得分:2)
这并不是那么神秘。
RandomAccessFile
当您需要随机访问时(罕见)FileWriter
当你写文字时FileChannel
当您需要NIO时FileOutputStream
。答案 1 :(得分:1)
简短回答:对可能执行少量并发I / O操作的应用程序使用java.io类。将java.nio类用于可能服务于大量concurrrent I / O操作的应用程序。
I / O操作可以是从TCP连接到Web服务器的任何操作(例如:并发HTTP请求),也可以是文件系统操作,用于执行文件读取或磁盘搜索到后端的数据库连接。
使用带有单个并发I / O操作的java.io的应用程序通常会优于使用java.nio的应用程序。
在具有大量并发I / O操作的服务器中,java.nio允许在客户端之间高效地交叉I / O.它还有机会通过减少线程数量以及内存和上下文切换开销来更有效地使用资源。
java.nio类的API因其性质而变得更加复杂。
在Web应用程序中,您应该检查您的容器(Tomcat,Jetty等)或您的Web框架(Play,JSF等)是否具有用于处理文件的API。来自Web应用程序的非托管文件I / O可能会引入其他安全漏洞。
Tomcat允许您切换到NIO后端(如果直接写入响应流,请注意可能的行为更改,如压缩和内容 - lengrh): https://tomcat.apache.org/tomcat-8.0-doc/aio.html
答案 2 :(得分:1)
用于阅读的Java IO:
FileInputStream类可以将文件内容作为字节流读取。 FileReader类使得可以将文件的内容作为字符流读取。 Java IO API中的RandomAccessFile类允许您移动文件并从中读取或根据需要写入文件。
答案 3 :(得分:0)
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.nio
(NIO代表非阻塞I / O)API是在J2SE 1.4(2002年2月6日)中引入的。提供新文件系统API(称为NIO.2)的NIO扩展随Java SE 7(2011年7月28日)发布,它在{{{{}}下包含新的子包java.nio.file
。 1}}
阻止呼叫:控制仅在呼叫完成时返回