2010-07-07 39 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

相關問題