【面试必备】Java IO

磁盘操作

 

File代表文件与目录信息,不代表内容

目录的递归

【面试必备】Java IO_第1张图片

 

字节操作

 

使用FileInputStream及FileOutputStream进行字节读写:

【面试必备】Java IO_第2张图片

 

装饰者模式:

在真的类外面包装一层,用于扩展内部的真的类

【面试必备】Java IO_第3张图片

使用BufferedInputStream可以实现对流的缓存。

 

字符操作

 

编码就是字符转字节,解码就是字节转字符

java采用utf-16be对中英文均采用两个字节存储

 

String类可以实现编码转换

【面试必备】Java IO_第4张图片

 

Reder与Writer

使用InputStreamReader将字节转换为字符,outputStreamWriter将字符转为字节

public static void readFileContent(String filePath) throws IOException {
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    } 
    // 装饰者模式使得 BufferedReader 组合了一个 Reader 对象
    // 在调用 BufferedReader 的 close() 方法时会去调用 Reader 的 close() 方法
    // 因此只要一个 close() 调用即可
    bufferedReader.close();
}

 

对象操作

 

序列化:将对象转为字节序列ObjectOutputStream.writeObject()

反序列化:字节转对象ObjectInputStream.readObject()

不会序列化静态变量及transient修饰的变量

 

Serializable接口是一个标准,执行序列化需要实现此接口。

 

 

网络操作

 

InetAddress表示IP地址

可以从URL中读取数据

【面试必备】Java IO_第5张图片

ServerSocket及Socket配合实现socket通信

【面试必备】Java IO_第6张图片

Datagram进行UDP通信

DatagramSocket数据通信socket,datagramPackage数据包

 

 

NIO

 

高速、面向块的数据处理方式。

I/O是流的形式处理数据,NIO以块的方式处理数据。

面向流的数据每次处理一个字节,速度慢,但是容易创建过滤器。

面向块的NIO每次处理一个块,速度快。

 

通道

对流的一种模拟,可以采用通道读写数据。通道与流不同之处在于,通道是双向的,既可以读,也可以写,甚至双工。

FileChannel:读写文件

DatagramChannel:UDP数据包读写

SocketChannel:TCP读写网络数据

ServerSocketChannel:监听TCP连接,对每一个新来的连接创建一个SocketChannel

 

缓冲区

对通道的读写不是直接进行的,需要经过缓冲区。任何数据的读写需要经过缓冲区。实质上是一个数组

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

 

缓冲区状态变量

capacity:最大容量

position:当前已经读写的字节数

limit:还可以读写的字节数

 

使用NIO文件读写的实例:

【面试必备】Java IO_第7张图片

 

选择器

 

NIO称为非阻塞IO,实质上是采用IO多路复用的Reactor模式,一个线程使用一个选择器Selector轮询监听多个Channel。使用一个线程处理多个事件而不是一个线程处理一个事件。对于IO密集型的应用具有很好的性能

【面试必备】Java IO_第8张图片

 

1. 创建选择器

2. 将通道注册到选择器上

选择:

【面试必备】Java IO_第9张图片

3. 监听事件

4. 获取到达的事件

【面试必备】Java IO_第10张图片

 

内存映射文件是一种快捷读取数据的方法,比常规的通道快的多。向内存文件写入数据相当于存盘,这个要注意。

MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);

将前1024字节映射到内存。

你可能感兴趣的:(JAVA面试必备)