您只想将BufferedReader子类化.
class MyBufferedReader extends BufferedReader {
MyBufferedReader(Reader r) {
super(r);
}
@Override
String readLine() {
String line = super.readLine();
// perform replacement here
return line;
}
}
照常打开文件,但不要将其包装在BufferedReader中,而是将其包装在子类中.
try ( Reader r = ...;
BufferedReader br = new MyBufferedReader(r)) {
String line;
while ((line = br.readLine()) != null) {
// use returned line
}
}
更新资料
以下是一个Reader,可以让您逐行替换输入流,同时仍向该流的用户提供Reader界面.
在内部,原始流被包装在BufferedReader中,并且一次读取一行.可以在已读取的行上执行任何所需的转换.然后将转换后的行转换为StringReader.当流的用户调用任何read(…)操作时,该请求将定向到缓冲的StringReader以满足.如果StringReader字符用完,则会加载并转换BufferedReader的下一行,以继续为read(…)提供输入.
abstract public class TranslatingReader extends Reader {
private BufferedReader input;
private StringReader output;
public TranslatingReader(Reader in) {
input = new BufferedReader(in);
output = new StringReader("");
}
abstract public String translate(String line);
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int read = 0;
while (len > 0) {
int nchars = output.read(cbuf, off, len);
if (nchars == -1) {
String line = input.readLine();
if (line == null) {
break;
}
line = tranlate(line);
line += "
"; // Add the newline which was removed by readLine()
output = new StringReader(line);
} else {
read += nchars;
off += nchars;
len -= nchars;
}
}
if (read == 0)
read = -1;
return read;
}
@Override
public void close() throws IOException {
input.close();
output.close();
}
}