1、题目描述
2、解题思路
用一个容量为 4 的数组 fileBuf 存放最近一次 read4 读取到的数据。
用一个变量 readOffset 指向 fileBuf 尚未使用的开头数据索引。
用一个变量 bufSize 表示最近一次 read4 读取到的数据字符个数。
大致算法逻辑如下:
每次调用 read(char[] buf, int n) 时,都是调用 n 次 getNextCharFromFile()。
getNextCharFromFile() 逻辑如下:
当 readOffset < bufSize,说明最近一次读取到 fileBuf 的数据还没用完,从 fileBuf 中取出一个字符,然后 readOffset++;
当 readOffset == bufSize,说明最近一次 read4 读到的数据已经用完了,于是再调用一次 read4,重置 readOffset 为 0,bufSize = read4(fileBuf)。接着从 fileBuf 拿出一个字符返回出去,readOffset++。
3、解题代码
/**
* The read4 API is defined in the parent class Reader4.
* int read4(char[] buf);
*/
public class Solution extends Reader4 {
/**
* @param buf Destination buffer
* @param n Number of characters to read
* @return The number of actual characters read
*/
private char[] fileBuf = new char[4]; // read4 读到的数据存到这里
private int readOffset = 0; // 指向 fileBuf 尚未使用的开头索引
private int bufSize = 0; // 最近一次从 read4 读到的数据有多少个
public int read(char[] buf, int n) {
for (int i = 0; i < n; i++) {
char nextChar = getNextCharFromFile();
if (nextChar == 0) {
return i;
} else {
buf[i] = nextChar;
}
}
return n;
}
public char getNextCharFromFile() {
// 比如最近一次 read4 读到的有效数据有 2 个,此时 readOffset == 2,说明 fileBuf 已经没有未使用的数据,需要重新 read4
if (readOffset == bufSize) {
bufSize = read4(fileBuf);
readOffset = 0;
if (bufSize == 0) {
return 0;
}
}
// readOffset 永远指向尚未读取的数据的最开头
return fileBuf[readOffset++];
}
}