java面试系列 ——IO (2)

ArrayList 中存储数据的数组 elementData 是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。

private transient Object[] elementData; 六、网络操作

java中的网络支持:

InetAddress:用于表示网络上的硬件资源,即IP地址

URL:统一资源定位符

Socke:使用TCP协议实现网络通信

Datagram:使用UDP协议实现网络通信

InetAddress

没有公有的构造函数,只能通过静态方法来创建实例。

InetAddress.getByName(String host); InetAddress.getByAddress(byte[] address); URL

可以直接从URL中读取字节流数据。

public static void main(String[] args) throws IOException { URL url = new URL("http://www.baidu.com"); /* 字节流 */ InputStream is = url.openStream(); /* 字符流 */ InputStreamReader isr = new InputStreamReader(is, "utf-8"); /* 提供缓存功能 */ BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } Sockets

ServerSocket:服务端类

Socket:客户端类

服务器和客户端通过InputStream和OutputStream进行输入输出

java面试系列 ——IO

Datagram

DatagramSocket:通信类

DatagramPacket:数据包类

七、NIO

新的输入/输出(NIO)库时在jdk1.4中引入的,弥补了原来的IO的不足,提供了高速 的、面向块的IO。

流与块

IO与NIO最重要的区别是数据打包和传输的方式,IO以流的方式处理数据,而NIO以块的方式处理数据

面向流的IO一次处理一个字节数据:一个输入流产生一个字节数据,一个输出流消费一个字节数据。为流式数据创建过滤器非常容易,链接几个过滤器,以便每个过滤器只负责复杂处理机制的一部分。不利的一面是,面向流的IO通常相当慢。

面向块的IO一次处理一个数据块,按块处理数据比按流处理数据要快得多。但是面向块的IO缺少一些面向流的IO所具有的优雅性和简单性。

通道与缓冲区 1、通道

通道Channel是对原IO包中的流的模拟,可以通过它读取和写入数据。

通道与流的不同之处在于,流只能在一个方向上流动感(一个流必须是inputStream或者OutputStream的子类)而通道是双向的,可以用于读、写或者同时用于读写。

通道包含以下类型:

FileChannel:从文件中读取数据

DatagramChannel:通过UDP读写网络中数据

SocketChannel:通过TCP读写网络中数据

ServerSocketChannel:可以监听新进来的TCP连接,对每一个新进来的连接都会创建一个SocketChannel

2. 缓冲区

发送给一个通道的所有数据都必须首先放到缓冲区中,同样地,从通道中读取的任何数据都要先读到缓冲区中。也就是说,不会直接对通道进行读写数据,而是要先经过缓冲区。

缓冲区实质上是一个数组,但它不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。

缓冲区包括以下类型:

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

3、选择器

NIO常常被叫做非阻塞IO,主要是因为NIO在网络通信中的非阻塞特性被广泛使用。NIO实现了IO多路复用的Reactor模型,一个线程Thread使用一个选择器Selector通过轮询的方式去监听多个通道Channel的事件,从而让一个线程就可以处理多个事件。(而IO在网络通信中,每当有一个socket连上,就开启一个线程,线程的创建和销毁是需要开销的,因此NIO的多路复用能够减少开销) 因此使用一个线程来处理多个事件而不是一个线程处理一个事件,对于 IO 密集型的应用具有很好地性能。

对比

NIO与普通IO的区别主要有以下两点:

NIO是非阻塞的

NIO面向块,IO面向流

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxzf.html