Java 扩展InputStreamReader行为的最有效方法是什么?

Java 扩展InputStreamReader行为的最有效方法是什么?,java,Java,我在一个项目中基本上有这样几行代码,它们将输入流复制到输入流读取器中,以便可以独立地进行流传输: final InputStream stream = new InputStream(this.in); ByteArrayOutputStream baos = new ByteArrayOutputStream(); org.apache.commons.io.IOUtils.copy(stream, baos); InputStream inputStream = new ByteAr

我在一个项目中基本上有这样几行代码,它们将输入流复制到输入流读取器中,以便可以独立地进行流传输:

final InputStream stream = new InputStream(this.in);    
ByteArrayOutputStream baos = new ByteArrayOutputStream();
org.apache.commons.io.IOUtils.copy(stream, baos);
InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
baos.close();
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
它工作正常,但我想将此代码封装到一个对象中,例如“InputStreamReaderCopy”,它将扩展InputStreamReader,以便可以像它一样使用它

我想先编写如下代码:

public class InputStreamReaderCopy extends InputStreamReader {
    public InputStreamReaderCopy(InputStream inputStream, String encoding) throws IOException{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, baos);
        InputStream newInputStream = new ByteArrayInputStream(baos.toByteArray());
        baos.close();
        super(newInputStream, encoding);
    }
}
但正如您所料,在构造函数中的其他内容之后调用super()是不可能的

最后我有了一个私人会员

private InputStreamReader reader;
使用InputStreamReader的委托方法并调用这些东西之王

@Override
public int read(CharBuffer target) throws IOException {
    return reader.read(target);
}
问题是我需要打电话

super(inputStream);
在构造函数的第一行,即使没有任何意义(因为所有overidden方法都调用私有成员的方法)。 有没有办法让这段代码更优雅?我应该避免扩展InputStreamReader吗

通过@maxime.bochon实现答案(非常适合我)


尝试将创建
InputStream
的代码放在
private static
方法中。然后,您应该能够将
super
调用放在第一位,并将方法调用作为第一个参数。这是您问题的第一部分…

您可以扩展
Reader
?您所说的“可以独立流式传输”是什么意思?streams的目的是能够在数据到达时处理数据。@PeterLawrey我希望有两个读卡器读取相同的内容,并且对第一个读卡器调用read()不会影响第二个读卡器。我根据您的答案编辑了我的问题。谢谢
public class InputStreamReaderCopy extends InputStreamReader {

    private static InputStream createInputStreamCopy(InputStream inputStream )throws IOException{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, baos);
        InputStream newInputStream = new ByteArrayInputStream(baos.toByteArray());
        baos.close();
        return newInputStream;
    }

    public InputStreamReaderCopy(InputStream inputStream) throws IOException{
        super(createInputStreamCopy(inputStream), "UTF-8");
    }
}