我这样扩展inputstreamreader
public class AsteriskInputStreamReader extends InputStreamReader {
boolean ast;
AsteriskInputStreamReader(InputStream is) {
super(is);
}
@Override
public int read() throws IOException {
ast = !ast;
if (ast) return '*';
return super.read();
}
}
它必须在从源代码得到的每个符号之后添加“*”符号 InputStream
. 但当我这样用的时候
InputStreamReader in = new AsteriskInputStreamReader(new FileInputStream("text.txt"));
int c;
while((c = in.read()) != -1){
System.out.print((char)c);
}
它只适用于文件中的最后一行。前面的行仅输出为一个“*”,没有任何文本。为什么?
第二个问题。
当我创建 BufferedInputStream
并尝试获取文件的第一行
BufferedReader reader = new BufferedReader(in);
System.out.println(reader.readLine());
我得到文件的第一行没有任何'*'。
获得我想要的东西的正确方法是什么:为创建 Package 器 InputStreamReader
,将在原始输入的所有符号后添加星号符号?
2条答案
按热度按时间0s7z1bwu1#
而不是子类化
InputStreamReader
,创建单独的Reader
您可以与其他读卡器链接,因此也可以将其应用于不受支持的读卡器InputStream
.格式化以强调链。
它不起作用的原因
BufferedReader
它不叫read()
方法,它调用一个接受缓冲区的重载(read(char[] cbuf)
,read(char[] cbuf, int off, int len)
,或read(CharBuffer target)
).实施
Reader
那是要被锁起来的,子类FilterReader
.dxxyhpgq2#
第一部分的答案似乎是您正在写出回车符。尝试通过替换行从输出中跳过它们
System.out.print((char)c);
具有对于第二部分,还需要重写
InputStreamReader
方法read(char[] cbuf, int offset, int length)
在你的AsteriskInputStreamReader
班级。