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