Java 拆分字节数组并将其正确组合

Java 拆分字节数组并将其正确组合,java,stream,bytearray,Java,Stream,Bytearray,我应该如何真正开始实施以下内容?我将不得不处理一个字节数组,该数组将在几行上包含文本。数据的平均大小可能约为10 KB 在未指定行数之后,将有一行以特殊标记(“FIRSTSTRING”)开头。稍后,在同一个文件的某个地方会有另一行,也以一个特殊标记(“SECONDSTRING”)开头。如果在字节数组中同时定义了第一行和第二行,则应复制第二行而不是第一行。然后返回结果字节数组 下面是我的第一次尝试。我还没有重构它来降低复杂性。我关心可靠性,也非常关心性能。似乎有太多的方法来解决这个问题,我缺乏判断

我应该如何真正开始实施以下内容?我将不得不处理一个字节数组,该数组将在几行上包含文本。数据的平均大小可能约为10 KB

在未指定行数之后,将有一行以特殊标记(“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();
  }

我觉得你可以通过使用guava io library@或commons io library@来简化代码。对于初学者来说,听起来你并没有精确地定义你的问题-你说会有一个“第一串”行,会有一个“第二串”行,但你接着说“如果两行都存在”…如果你知道总会有第二行,事情就会简单得多

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

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


哦,您正在将字节转换为字符串,而没有指定显式字符编码。千万不要这样做。如果您知道字符编码是什么,请显式指定它(在
InputStreamReader
的构造函数中)。如果你不知道字节流的字符编码是什么,那么你根本无法可靠地读取它。

你的问题是什么?它是否按你想要的方式运行?你是在问应该重构什么?这是在生产系统中进行的吗?这段代码的目的是什么,家庭作业?我在考虑重用如果需要,可用于重写第三方web应用程序数据的可编辑组件。这是一个宠物项目。问题主要是这样处理数据是否有效,我的方法是否合理……真正使用过这类东西的人应该能够给我一些提示,我可以处理其余的:)我不知道我是否会这样做遇到一些奇怪的编码问题,或者速度太慢等等……看看IOUtils,我可以看到一些有用的东西……绝对值得使用。有趣。我强烈建议使用Guava而不是commons io。Guava组织得更好,在适用的情况下支持泛型,并强烈鼓励不要使用平台默认值通过要求您为任何
字符串
字节[]
转换指定
字符集
,到处编码。