我在项目中基本上有这些代码行,它们将输入流复制到输入流读取器中,以便可以独立地流式传输:
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");
}
}
答案 0 :(得分:1)
尝试在InputStream
方法中创建private static
代码。然后,您应该能够将super
调用放在第一位,方法调用作为第一个参数。 这是您问题的第一部分......