1

我正在尝试使用 FilterInputStream 但我无法使其工作。如果我编写一个 FilterReader 一切顺利:

import java.io.*;

class Filter extends FilterReader {
  Filter(Reader in) {
    super(in);
  }

  public int read() throws IOException {
    return 'A';
  }
}

public class TestFilter {
  public static void main(String[] args) throws IOException {
    Reader in = new Filter(new InputStreamReader(System.in));
    System.out.println((char)in.read());
  }
}

执行是 A

但如果我使用 FiterInputStream,执行块读取:

import java.io.*;

class Filter extends FilterInputStream {
  Filter(InputStream in) {
    super(in);
  }

  public int read() throws IOException {
    return 'A';
  }
}

public class TestFilter {
  public static void main(String[] args) throws IOException {
    Reader in = new InputStreamReader(new Filter(System.in));
    System.out.println((char)in.read());
  }
}
4

3 回答 3

2

在第一种情况下 in.read() 直接调用 Filter.read() 方法。在第二种情况下,in.read() 调用 InputStreamReader.read()。
现在我们可能期望它将调用委托给 Filter.read()。但是 InputStreamReader.read() 实现做了别的事情——我不明白它在做什么。
但最终调用了FilterInputStream.read(byte[], int, int)方法,等待用户输入。所以为了得到你期望的行为——我猜——我们需要重写这个读取方法——如下所示。

导入java.io.*;

class Filter extends FilterInputStream {
  Filter(InputStream in) {
    super(in);
  }

  public int read() throws IOException {
    return 'A';
  }

  @Override
    public int read(byte[] b, int off, int len) throws IOException {
      if(len == 0) {
          return 0;
      }
      b[off] = (byte) read();
      return 1;
     }

}

public class TestFilter {
  public static void main(String[] args) throws IOException {
    Reader in = new InputStreamReader(new Filter(System.in));
    System.out.println((char)in.read());
  }
}
于 2012-07-06T14:01:51.953 回答
2

在第一个代码中,您的 Reader 是:

new Filter(new InputStreamReader(System.in));

它的read方法是您已覆盖的方法:

public int read() throws IOException {
    return 'A';
}

在第二个代码中,您的 Reader 是:

new InputStreamReader(new Filter(System.in));

并且read没有使用您的过滤器的方法。阅读器会等待,System.in因此您必须输入某些内容 (+ ENTER) 才能读取某些内容。

于 2012-07-06T13:29:46.787 回答
0

在你的第二次TestFilter更换

Reader in = new InputStreamReader(new Filter(System.in));

InputStream in = new Filter(System.in);

这将Filter.read()在您创建的发送“A”到的类上执行System.out

于 2012-07-06T13:37:36.817 回答