【问题标题】:Does FilterOutpuStream perform write normally or not?FilterOutpuStream 是否正常执行写入?
【发布时间】:2013-07-19 14:14:44
【问题描述】:

甲骨文documentation 说:

write(byte[] b, int off, int len) 抛出 IOException

从偏移量 off 开始的指定字节数组写入 len 个字节 到这个输出流。 FilterOutputStream 的 write 方法调用 每个要输出的字节上的一个参数的写入方法。

请注意,此方法不会调用其底层的 write 方法 输入具有相同的参数。 FilterOutputStream 的子类 应该提供此方法的更有效实现。

我有两个问题:

  1. this 页面上,我发现代码使用FilterOutputStream 装饰FileOutputStream,并将正常输出写入文件。当FilterOutputStream能够在底层流上调用相同的重载并使操作更快时,为什么FilterOutputStream在每个字节上调用底层流的write()方法?
  2. 为什么底层流是input流?

谢谢。

【问题讨论】:

    标签: java filter stream output java-io


    【解决方案1】:
    1. 我相信重点是,如果你想要一个非常简单 的过滤器,你可以重写write(int) 方法,并且知道一切都会通过它。这将是低效的,但工作。因此,如果您想要一个过滤掉每个偶数字节的流,您可以轻松做到:

      public class OddByteOutputStream extends FilterOutputStream
      {
          public OddByteOutputStream(OutputStream output)
          {
              super(output);
          }
      
          @Override
          public void write(int b)
          {
              if ((b & 1) == 1)
              {
                  out.write(b);
              }
          }
      }
      

      另一种方法是让write(byte[]) 代表,但让write(int)write(byte[], int, int) 抽象,以强制 子类来确定如何合理有效地处理调用。 p>

    2. 我怀疑这只是一个错字。

    【讨论】:

    • 谢谢。还有一个可选问题:我是否必须在自己的覆盖中调用 super() 版本?
    • @user35443: write(byte[], int, int)?绝对不会 - 这样做会导致重复数据,假设您然后在您的覆盖中自己处理数据。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多