在日常的工作当中, IO主要涉及两个方面: 文件IO(磁盘IO) 和网络IO. 本文主要是剖析一下Java中文件IO的实现方式.
一、磁盘IO:
在 Java 编程中,磁盘 IO (Input and Output) 是指与硬盘或其他外部存储设备进行数据交互的过程。
要了解磁盘IO首先要了解java.io中的相关的类其中 File 和 FileReader 是常用的类;
public static void main(String[] args) {
File file = new File("path/to/file.txt");
try (FileReader reader = new FileReader(file)) {
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
} catch (IOException e) {
e.printStackTrace();
}
}
上面的示例中,首先创建了一个 File 对象来表示要读取的文件。然后,使用 FileReader 类来创建一个文件读取器,并在 try-with-resources 语句中使用它来读取文件的内容。通过调用 read() 方法,可以逐个字符地读取文件的内容,并将其打印到控制台。
1.常见的磁盘IO对象
2.文件操作注意事项
文件路径:在读取或写入文件之前,我们需要准确地指定文件的路径。可以是绝对路径或相对路径。如果指定的文件不存在,Java 将尝试创建该文件。
文件关闭:为了释放资源并确保文件的完整性,我们应该在操作完成后关闭文件。可以使用 try-with-resources 语句来自动关闭文件。
异常处理:在进行文件 IO 操作时,可能会发生各种异常,如文件不存在、权限不足等。因此,我们应该用合适的异常处理机制来处理这些异常,以便在出现错误时能够进行适当的处理。
二、网络IO模型:
I/O模型:I/O模型就是用什么样的通道进行数据的发送和接受,很大程度上决定了程序通信的性能
BIO同步阻塞IO:同步且阻塞(传统阻塞性),服务器实现模式为一个连接一个服务器,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
缺点:BIO的缺点是客户端一直在连接服务器,服务器会为每一个客户端开辟一个线程对客户端处理,但有时客户端不是一直对服务器进行IO操作的,所以这样会导致服务器阻塞,进而对服务器产生很多不必要的线程开销,资源浪费
NIO同步非阻塞IO:同步且阻塞(传统阻塞性),服务器实现模式为一个连接一个服务器,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
优点:由于客户端不是一直对服务器进行IO操作的,所以通过Selector选择器进行轮询,均匀分配到需要对服务器进行IO操作的客户端,这样就利用了客户端闲置的时间来节省服务器内存的消耗
AIO异步非阻塞IO: 异步非阻塞,AIO引入异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用