Разделение байтового массива и его правильное соединение - PullRequest
0 голосов
/ 07 июля 2010

Как мне на самом деле реализовать следующее? Мне придется обрабатывать байтовый массив, который будет содержать текст в несколько строк. Средний размер данных, вероятно, составит около 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();
  }

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

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

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

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

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

0 голосов
/ 07 июля 2010

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

...