Java中的IO

简介

IO操作一般来讲比较耗时,可能操作本地的文件、目录,也可能操作网络上的资源,影响 IO 操作性能的主要方面是数据格式和存储的方式,Java中的IO主要在 java.io 包下,分为四个部分:

1、基于字节操作的 I/O 接口:InputStream 和 OutputStream

2、基于字符操作的 I/O 接口:Reader 和 Writer

3、基于磁盘操作的 I/O 接口:File

4、基于网络操作的 I/O 接口:Socket

基于字节的 I/O 操作

InputStream 是个抽象类,里面的核心方法是 read(), read(byte b[]),read(byte b[], int len, int off),用于读取底层数据的方法,可以用来读取的数据类型包括:字节数组、String对象、文件、管道、流、Internet资源,每一种资源都有相应的InputStream子类

基于字符的 I/O 操作

Writer和Reader操作的目的就是操作字符和不是字节

NIO 非阻塞式 I/O

有一个专门的线程处理 I/O 事件并负责分发;事件驱动机制,而不是同步监视事件;线程之间通过 wait/notify 通信,确保每次线程切换都有意义。

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。

NIO 创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区),转移回操作系统,因而可以极大地提高速度。

NIO最重要的区别是数据打包和传输的方式。

一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O

你可能感兴趣的:(Java中的IO)