FilterInputStream不执行

时间:2012-07-06 13:16:15

标签: java io

我正在尝试使用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());
  }
}

3 个答案:

答案 0 :(得分:2)

在第一个代码中,您的阅读器是:

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

及其read方法是您覆盖的方法:

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

在第二个代码中,您的阅读器是:

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

并且未使用过滤器的read方法。 Reader会在System.in上等待,所以你必须输入一些东西(+ ENTER)来读取内容。

答案 1 :(得分:2)

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

import 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());
  }
}

答案 2 :(得分:0)

在您的第二个TestFilter替换

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

InputStream in = new Filter(System.in);

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