2010-07-07 1 views
0

Как я должен действительно реализовать следующее? Мне придется обрабатывать массив байтов, который будет содержать текст на нескольких строках. Средний размер данных, вероятно, составит около 10 килобайт данных.Разделение массива байтов и его правильное соединение

После неуказанного количества линий будет линия, начинающаяся со специального токена («FIRSTSTRING»). Позже где-то в том же файле будет другая строка, также начинающаяся со специального токена («SECONDSTRING»). Если и первая и вторая строки определены в массиве байтов, вторая строка должна быть скопирована вместо первой строки. После этого возвращаемый массив байтов должен быть возвращен.

Ниже представлена ​​моя первая попытка. Я еще не реорганизовал его, чтобы уменьшить сложность. Меня беспокоит надежность, а также очень большая производительность. Кажется, слишком много способов обойти это, и мне не хватает опыта, необходимого для суждения. Я бы очень признателен за хороший вклад в это.

private byte[] handleHeader(final byte[] input) throws IOException { 

    // input 
    ByteArrayInputStream bais = new ByteArrayInputStream(input); 
    InputStreamReader isr = new InputStreamReader(bais); 
    BufferedReader brs = new BufferedReader (isr); 
    // output 
    ByteArrayOutputStream data = new ByteArrayOutputStream(); 
    ByteArrayOutputStream after = new ByteArrayOutputStream(); 

    String line=null; 
    String original=null; 
    String changeWith=null; 

    while ((line = brs.readLine())!=null) { 
     line+="\n"; 
      if (line.startsWith("FIRSTSTRING")) { 
       original = line; 
       continue; 
      } 
      if (line.startsWith("SECONDSTRING")) { 
       changeWith = line; 
       continue; 
      } 
      if ("".equals(original)) { 
       data.write(line.getBytes()); 
      } else { 
       after.write(line.getBytes()); 
      } 

     } 

if (changeWith!=null && original != null) { 
    changeWith+="\n"; 
    data.write(changeWith.getBytes()); 
} else if (original != null){ 
    data.write(original.getBytes()); 
} 

after.writeTo(data); 

return data.toByteArray(); 
    } 
+0

Что вы хотите сказать? Это работает так, как вы хотите или нет? Вы спрашиваете, что нужно реорганизовать? Это происходит в производственной системе? Какова цель этого кода, домашнее задание? – Zak

+0

Я думаю о многократном компоненте для перезаписи данных сторонних веб-приложений, если это когда-либо понадобилось. Это проект для домашних животных. Вопрос в основном заключается в том, насколько эффективна обработка данных, и мой подход звучит ... Кто-то, кто работал с подобными вещами на самом деле, должен уметь давать мне подсказки, и я могу работать на остальном :) Я не знаю, буду ли я сталкиваться с некоторыми странными проблемами с кодировкой, или если это будет глупо медленным и т. Д. ... – user385797

ответ

0

Для начала это не звучит, как вы определили вашу проблему точно - вы говорят, что там будет быть строка «FIRSTSTRING», и там будет быть строка «SECONDSTRING», но затем вы идете, чтобы сказать «если обе строки присутствуют» ... Если вы знаете, что всегда будет быть второй линией вещи становятся намного проще

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

  • Создать StringBuilder для хранения общего вывода.
  • Итерации по линиям, добавляя все «нормальные» линии прямо к выходу.
  • Когда (/ если) вы сталкиваетесь с строкой «FIRSTSTRING», сохраните это в отдельной переменной и создайте второй StringBuilder, чтобы удерживать «вторую половину» текста.
  • Продолжайте повторять, добавив все остальные обычные строки к этому второму StringBuilder.
  • Когда (/ if) вы сталкиваетесь с строкой «SECONDSTRING», добавьте это к основному выходу, затем добавьте всю вторую строку StringBuilder к основному выводу, а затем добавьте оставшиеся строки в основной вывод.
  • Если вы дойдете до конца файла, не найдя вторую строку строки, добавьте сохраненную строку FIRSTSTRING в общий вывод и следуйте за ней с содержимым второго StringBuilder.

О, и ты превращаешься байты в строки без указания явной кодировки символов. Никогда не делай этого. Если вы знаете, что такое кодировка символов, укажите ее явно (в конструкторе InputStreamReader). Если вы не знаете, что кодировка символов потока байтов, , то вы не можете прочитать это надежно на всех.

0

я чувствую, вы можете упростить код, используя либо гуавы Io библиотеки @http://code.google.com/p/guava-libraries/ или Обще-Io библиотеки @http://commons.apache.org/io/

+0

Глядя на IOUtils, я вижу пару полезных вещей там ... Определенно стоит использовать. Интересно. – user385797

+0

Я бы настоятельно рекомендовал использовать Guava, а не commons-io. Гуава лучше организована, поддерживает общие возможности и настоятельно рекомендует не использовать кодировку по умолчанию по умолчанию, требуя, чтобы вы указали 'Charset' для любых' String' 'byte []' конверсий. – ColinD

Смежные вопросы