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

+0

필자는 필요할 경우 제 3 자 웹 응용 프로그램 데이터를 다시 작성하기 위해 재사용 가능한 구성 요소를 고려 중입니다. 그것은 애완 동물 프로젝트입니다. 문제는 대부분 이런 식으로 데이터를 처리하는 것이 효율적이며 내 접근법이 건전한 지 여부에 관한 것입니다 ... 이런 종류의 물건으로 작업 한 사람은 나에게 몇 가지 힌트를 줄 수 있어야하며 나머지는 작업 할 수 있어야합니다. 이상한 인코딩 문제가 발생하거나 바보처럼 느려지는지 모르겠다. – user385797

답변

0

정확하게 문제를 정의한 @ 당신이 http://code.google.com/p/guava-libraries/ 또는 공유지-IO 라이브러리 @ 라이브러리 IO 구아바 중 하나를 사용하여 코드를 단순화 할 수 있다고 생각 - 당신을 이 "FIRSTSTRING"라인이되고 거기에 이 "SECONDSTRING"라인이 될 것이라고 말하면 " 두 줄이있는 경우"라고 말하면서 계속 진행됩니다. 두 번째 줄이 더 쉬워진다.

어떤 경우

는 다음과 같은 알고리즘을 구현하고 나중에 이해하기가 비교적 용이해야하고, 너무 비효율적 안 :

  • 는 전체 출력을 보유 할의 StringBuilder를 만듭니다.
  • 모든 "정상적인"선을 출력에 직접 추가하여 선을 반복합니다.
  • "/ FIRSTSTRING"줄을 발견하면 별도의 변수에 저장하고 두 번째 StringBuilder를 만들어 텍스트의 "후반부"를 저장하십시오.
  • 이 두 번째 StringBuilder에 모든 추가 정상선을 추가하면서 계속 반복합니다.
  • "/ SECONDSTRING"줄을 발견하면 기본 출력에 추가 한 다음 두 번째 StringBuilder 전체를 기본 출력에 추가 한 다음 나머지 줄을 주 출력에 추가하십시오.
  • 두 번째 문자열 줄을 찾지 않고 파일의 끝에 도달하면 저장된 FIRSTSTRING 줄을 전체 출력에 추가하고 두 번째 StringBuilder의 내용을 따라야합니다.

오, 당신은 명시 적으로 문자 인코딩을 지정하지 않고 문자열로 바이트를 돌고있다. 그러지 마. 문자 인코딩이 무엇인지 아는 경우 명시 적으로 지정하십시오 (InputStreamReader의 생성자에서). 바이트 스트림의 문자 인코딩이 무엇인지 알고 있다면 을 전혀 읽을 수 없습니다.

0

은 내가 당신 같은 소리하지 않습니다 우선 들어 http://commons.apache.org/io/

+0

IOUtils를 보면 몇 가지 유용한 것들을 볼 수있다. 흥미 롭 군. – user385797

+0

commons-io 대신 Guava를 사용하는 것이 좋습니다. Guava는 더 잘 구성되어 있으며, 제네릭을 지원하며, 문자열 기반의 <-> byte [] 변환에 대해 Charset을 지정해야하므로 플랫폼 기반의 기본 인코딩을 사용하지 않을 것을 강력히 권장합니다. – ColinD