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