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

时间:2015-08-17 09:55:22

标签: java

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

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);

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

通过@ maxime.bochon实现回答(这很适合我)

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");
    }
}

1 个答案:

答案 0 :(得分:1)

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