2012-06-27 3 views
1

그래서 내있는 ByteArrayOutputStream의 처음 4 바이트 내 스트림 헤더의 길이를 포함한다. 스트림에서 해당 헤더를 제거하고 내 비즈니스로 이동해야합니다.ByteArrayOutputStream에서 바이트를 제거하려면 어떻게해야합니까?

ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 
/* populate ByteArrayOutputStream */ 

//grab first int 
int headerLength = oStream.toByteArray()[4]; 

//remove headerLength 
String newString = oStream.toString().substring(jsonLength, oStream.size()); 
oStream.write(newString.getBytes()); 

나는 이것이 적절한 방법이라고 생각하지 않는다. 아무에게도 제안이 있습니까?

+8

왜 스트림에 기록합니까? 처음부터 쓰지 마세요. –

+0

@JB Nizet - 사실은 이해하기 쉽게하기 위해 많은 코드를 생략했습니다. 일단 내가 그들을 사용해야하지만 그들을 사용해야합니다. – Grammin

+3

@Grammin : 당신은 이해하기 쉽지 않은 것들을 만들었습니다. 당신은 그것들을 완전히 이해할 수 없게 만들었습니다. 정말로 당신이 무엇을하려하는지 명확하지 않습니다. –

답변

0

당신이 요구하는지 무엇을 할 수있는 방법이 없습니다.
당신은 remove 메소드로 자신 만의 OutputStream을 만들어야 할 것입니다.
이 OutputStream이 다른 OutputStream 매개 변수로 받아 들여지며, 쓰기를 수행하면 ByteArrayOutputStream이하는 것과 유사한 기술을 사용하여 바이트가 누적됩니다.
제거하면 내부 데이터 구조에 액세스 할 수 있습니다 (let 's 배열을 말하십시오) 제거 알고리즘을 코드화합니다 (예 : N 위치에서 시작하여 배열에서 M 항목 제거). 난 그냥 그 code를 확인하고 (필드가 "BUF"라는) 보호되는 내부 버퍼 밝혀 - -
또 다른 옵션은있는 ByteArrayOutputStream을 확장하는 것입니다 그래서이 내 위의 제안을 구현합니다. 코드는 (전체 코드를 제공하지 않음)과 같아야합니다 : 당신이 달성 할 수있는 경우

public class MyByteArrayOutputStream extends ByteArrayOutputStream { 
    //Implement all the CTORs 

    public int remove (int startFrom, int length) { 
     //Implement removal algorithm on array on the field "buf" 
     //return the number of removed elements 
    } 
} 
4

간단한 대답은 ... 처음에 4 바이트를 작성하는 것입니다.

또 다른 대답은 기록 된 최초의 4 바이트를 무시하고 사용자 정의하는 FilterOutputStream의 서브 클래스를 작성하는 것입니다.

는 또 다른 당신이 필요로하는 원래의 "조각"을 포함하는 새로운 바이트 배열을 생성하기 위해 Arrays.copy 방법 중 하나를 사용하여 다음 바이트를 추출하는 것입니다; 예 : 당신이 무엇에 따라 마지막으로

System.arraycopy(array, 4, array.length - 4, array, 0); // YMMV - check javadoc 

:

byte[] subarray = Arrays.copyOfRange(original, 4, original.length - 4); 

또는 응용 프로그램이 바이트 배열의 말미에 "정의되지 않은"영역에 대처할 수 있다면, 당신은 같은 것을 할 수

에 대한 바이트 배열을 사용하는 경우, 그들을 제거하지 않고 처음 4 바이트를 무시할 수있는 좋은 기회가 있습니다. 예를 들어, 스트림에서 바이트를 쓰거나, 바이트에서 문자열을 만들거나, ByteBuffer에 바이트를 복사 할 때이 작업을 수행 할 수 있습니다. 나중에 그들을 제거해야하는 경우

관련 문제