拆分字节数组并将其重新组合在一起

时间:2010-07-07 17:39:30

标签: java stream bytearray

我应该如何实施以下内容?我将不得不处理一个包含多行文本的字节数组。数据的平均大小可能约为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 :(得分:0)

我觉得你可以使用guava io库@ http://code.google.com/p/guava-libraries/或commons-io library @ http://commons.apache.org/io/来简化代码

答案 1 :(得分:0)

对于初学者而言,听起来并不是说你已经准确地定义了你的问题 - 你说成为“FIRSTSTRING”行,并且成为一个“SECONDSTRING”行,但接着你继续说“如果两条线都存在”......如果你知道总会有第二行事情变得更简单

在任何情况下,以下算法应该相当容易实现和理解,并且不应该太低效:​​

  • 创建一个StringBuilder来保存整体输出。
  • 遍历这些行,将所有“正常”行直接添加到输出中。
  • 当(/ if)遇到“FIRSTSTRING”行时,将其存储在一个单独的变量中,并创建第二个StringBuilder来保存文本的“后半部分”。
  • 继续迭代,将所有其他法线添加到第二个StringBuilder。
  • 当(/ if)遇到“SECONDSTRING”行时,将其附加到主输出,然后将整个第二个StringBuilder附加到主输出,然后将剩余的行追加到主输出。
  • 如果到达文件的末尾而未找到第二个字符串行,则将保存的FIRSTSTRING行附加到整个输出,并使用第二个StringBuilder的内容进行跟进。

哦,你在没有指定明确的字符编码的情况下将字节转换为字符串。永远不要那样做。如果您知道字符编码是什么,请明确指定它(在InputStreamReader的构造函数中)。如果知道字节流的字符编码是什么,那么你就无法可靠地读取它