2013-07-20 2 views
1

Oracle documentation говорит:Выполняет ли FilterOutpuStream запись нормально или нет?

записи (байт [] Ь, Int Off, Int длина) бросает IOException

Запись LEN байт из заданного массива байтов, начиная со смещения от на этот выходной поток. Метод write FilterOutputStream вызывает метод записи одного аргумента для каждого байта для вывода.

Следует отметить, что этот метод не вызывает метод записи его основной входного потокас теми же аргументами. Подклассы FilterOutputStream должны обеспечить более эффективную реализацию этого метода.

У меня есть два вопроса:

  1. На this страницы я нашел код, который использует FilterOutputStream для украшения FileOutputStream, и записывает обычный вывод в файл. Почему FilterOutputStream вызывает метод базового потока по каждому байту, когда он способен вызывать такую ​​же перегрузку в базовом потоке и быстрее выполнять операцию?
  2. Почему базовый поток ввод поток?

Спасибо.

ответ

2
  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) абстрактную, чтобы силу подклассы как эффективно обрабатывать вызовы.

  2. Это только опечатка, я подозреваю.

+0

Спасибо. Еще один необязательный вопрос: нужно ли мне переводить 'super()' в собственные переопределения этого метода? – user35443

+0

@ user35443: из 'write (byte [], int, int)'? Абсолютно нет - это приведет к дублированию данных, предполагая, что вы тоже *, а затем обрабатываете данные самостоятельно в своем переопределении. –

+0

Спасибо большое! ... – user35443