java扩展inputstreamreader无法正常工作

wqsoz72f  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(339)

我这样扩展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 ,将在原始输入的所有符号后添加星号符号?

0s7z1bwu

0s7z1bwu1#

而不是子类化 InputStreamReader ,创建单独的 Reader 您可以与其他读卡器链接,因此也可以将其应用于不受支持的读卡器 InputStream .

try (BufferedReader reader = new BufferedReader(
                                new AsteriskReader(
                                   new InputStreamReader(
                                      new FileInputStream("text.txt"))))) {
    // ...
}

格式化以强调链。
它不起作用的原因 BufferedReader 它不叫 read() 方法,它调用一个接受缓冲区的重载( read(char[] cbuf) , read(char[] cbuf, int off, int len) ,或 read(CharBuffer target) ).
实施 Reader 那是要被锁起来的,子类 FilterReader .

class AsteriskReader extends FilterReader {
    private boolean ast;
    private boolean astMarked;

    public AsteriskReader(Reader in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        // TODO Add handling of EOF
        ast = !ast;
        if (ast) return '*';
        return super.read();
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Implement this, i.e. only read half number of characters from
        //      underlying reader, then inject '*' characters between all the
        //      chars actually read.
        //      Special handling for odd value of len.
        int charsRead = super.read(cbuf, off, len);
        return charsRead;
    }

    @Override
    public long skip(long n) throws IOException {
        // TODO Fix this to handle odd value of n.
        long actualSkipped = super.skip(n / 2);
        return actualSkipped * 2;
    }

    @Override
    public void mark(int readAheadLimit) throws IOException {
        super.mark((readAheadLimit + 1) / 2); // Underlying reader only needs to remember half
        this.astMarked = this.ast;
    }

    @Override
    public void reset() throws IOException {
        super.reset();
        this.ast = this.astMarked;
    }

}
dxxyhpgq

dxxyhpgq2#

第一部分的答案似乎是您正在写出回车符。尝试通过替换行从输出中跳过它们 System.out.print((char)c); 具有

if (c != '\r') {
    System.out.print((char) c);
}

对于第二部分,还需要重写 InputStreamReader 方法 read(char[] cbuf, int offset, int length) 在你的 AsteriskInputStreamReader 班级。

相关问题