Производительность DataInputStream \ DataOutputStream - PullRequest
5 голосов
/ 05 марта 2012

В настоящее время я использую буферизованные потоки для чтения и записи некоторых файлов.В промежутке я делаю некоторую математическую обработку, где символ является байтом.

Для чтения:

InputStream input = new FileInputStream(outputname)
input.read(byte[] b,int off,int len)

Для записи:

OutputStream output = new BufferedOutputStream(
                           new FileOutputStream(outputname),
                           OUTPUTBUFFERSIZE
                       )
output.write((byte)byteinsideaint);

Теперь мне нужно добавить некоторые данные заголовка и также поддерживать короткие символы.Я хочу использовать DataInputStream и DataOutputStream, чтобы самому не преобразовывать другие типы в байты, и мне интересно, какова их производительность.

Нужно ли использовать

OutputStream output = new DataOutputStream(
                             new BufferedOutputStream(
                                  new FileOutputStream(outputname),
                                  OUTPUTBUFFERSIZE
                             ) 
                       );

, чтобы сохранить преимущества буферизации данных, или достаточно использовать

OutputStream output = new DataOutputStream(
                           new FileOutputStream(outputname)
                       )

Ответы [ 2 ]

7 голосов
/ 05 марта 2012

Вы должны добавить BufferedOutputStream между ними. DataOutputStream не реализует никакого кэширования (что хорошо: разделение проблем), и его производительность будет очень низкой без кэширования базового OutputStream. Даже самые простые методы, такие как writeInt(), могут привести к четырем отдельным операциям записи на диск.

Насколько я вижу, только write(byte[], int, int) и writeUTF(String) записывают данные в один byte[] блок. Другие записывают примитивные значения (например, int или double) побайтно.

1 голос
/ 05 марта 2012

Вам обязательно нужен BufferedOutputStream посередине.

Я ценю ваше беспокойство по поводу производительности, и у меня есть 2 предложения:

  1. Сократите свои потоки с помощью сжатия Java. Полезную статью можно найти здесь .
  2. Используйте композицию вместо наследования (что в любом случае рекомендуется). Создайте канал, который содержит PipedInputStream и PipedOutputStream, связанные друг с другом, с помощью методов getInputStream () и getOutputStream (). Вы не можете напрямую передать объект Pipe чему-то, нуждающемуся в потоке, но вы можете передать возвращаемое значение его get методы сделать это.
...