2010-07-07 59 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 2010-07-07 17:43:11

+0

我正在考虑重写第三方Web应用程序数据的可重用组件,如果有需要的话。这是一个宠物项目。问题主要是关于处理这样的数据是否有效,而且我的方法是合理的......有人与这类真实的东西一起工作应该能够给我一些提示,我可以在其他方面工作:) 我不知道我是否会遇到一些奇怪的编码问题,或者如果这将是愚蠢缓慢等... – user385797 2010-07-07 17:47:50

回答

0

对于初学者来说它听起来并不像你精确定义你的问题的代码 - 你说有是一个“FIRSTSTRING”行,并有是一个“SECONDSTRING”行,但然后你继续说:“如果两行都存在”...如果你知道会有永远第二行事情变得简单多了

在任何情况下,像下面的算法应该是相当容易实现,后来明白了,不应该太低效:​​

  • 创建一个StringBuilder保持整体输出。
  • 遍历线条,将所有“常规”线条直接添加到输出。
  • 当(/ if)遇到“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 2010-07-07 17:58:36

+0

我强烈建议使用番石榴而不是commons-io。番石榴的组织性更好,在适用的地方支持泛型,并强烈鼓励不要在任何地方使用平台默认编码,因为要求为任何字符串转换指定一个“Charset”。 – ColinD 2010-07-07 19:33:21

相关问题