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() メソッドを呼び出します。2 番目のケースでは、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

最初のコードでは、リーダーは次のとおりです。

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

そしてそのreadメソッドはあなたがオーバーライドしたものです:

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

2 番目のコードでは、Reader は次のとおりです。

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

readフィルターのメソッドは使用されません。リーダーは代わりに待機するSystem.inため、何かを入力するには (+ ENTER) 何かを入力する必要があります。

于 2012-07-06T13:29:46.787 に答える
0

2回目の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 に答える