2011-04-05 3 views
1

이 InputStream에 설명서를 말한다 buf를 버퍼 배열로서 사용하도록ByteArrayInputStream이 바이트 배열을 복사하지 않습니까?

java.io.ByteArrayInputStream.ByteArrayInputStream (바이트 [] BUF) 는이 InputStream를 생성한다. 버퍼 배열은 복사되지 않습니다. pos의 초기 값은 0이고 count의 초기 값은 buf의 길이이다. 매개 변수 : buf 입력 버퍼.

나는 아래의 코드를 실행

,

 byte[] b = new byte[10]; 
    ByteArrayInputStream bais = new ByteArrayInputStream(b); 
    String someText = "Java byte arrayinput stream test - this string will be used."; 
    b = someText.getBytes(); 

    int c =0; 
    while((c = bais.read()) != -1){ 
     System.out.print((char)c); 
    } 

은 내가 얻을 출력은 10 바이트 빈 배열이 아닌 테스트하는 데 사용되는 문자열을 기반으로합니다. 이것은 전달 된 바이트 배열에 대한 참조를 저장하는 대신 ByteArrayInputStream의 생성자가 바이트 배열을 복사해야 함을 나타냅니다. 이는 문서와 모순됩니다. 바이트 배열이 복사되거나 그렇지 않으면 누구나 내 이해를 명확히 할 수 있습니까? (그리고 복사되지 않으면 출력이 바이트 배열 B의 상태를 반영하지 않는 이유는 무엇입니까?)

+0

4 번 줄을 보면 인자에 무엇이 잘못된 것인지 알 수 있습니다. 정확하게 b = someText.getBytes()는 무엇을합니까? – Ingo

+0

나는 그것을 깨닫는다.. 나는 모든 대답을 읽은 후 질문을하는 것이 얼마나 순진한 지에 대해서만 놀라실 수있다! – Bhaskar

답변

2

Java 변수의 작동 방식을 잘못 이해했습니다.

문은 새로운 byte[]를 만들어 변수 b에 대입

byte[] b = new byte[10]; 

이 문이 다른 새로운 byte[] 생성하고, 해당 변수의 전 내용을 대체 변수 b에 대입

b = someText.getBytes(); 

b에 저장된 원래 값을 ByteArrayInputStream 생성자에 전달합니다. 내부적으로, 스트림은 생성자에 의해 값이 할당되는 자체 변수를가집니다. 그런 다음 프로그램의 변수를 변경하지만 그렇게하면 스트림의 변수가 변경되지 않습니다.

2

처음에 할당 된 byte[]을 수정하지 않을 것입니다. . 첫 번째 줄에 대신

당신은 단순히 새로운 byte[]를 가리 키도록 b을-할당을 다시하고

을 대신을 시도해보십시오.

b[0] = 'H'; 
b[1] = 'e'; 
b[2] = 'l'; 
b[3] = 'l'; 
b[4] = 'o'; 
6

문제는 당신 assignmen 함께 t 진술. 입력 스트림의 배열은 하나의 같은 선언입니다 :

byte[] b = new byte[10]; 

그러나 당신은 문자열의 getBytes() 새 배열을 만들고 ㄱ 그 값을 할당 할를 사용하는 경우.

byte[] tmp = someText.getBytes(); 
for(int i=0;i < Math.min(tmp.length, b.length);i++) { 
    b[i] = tmp[i]; 
} 

: 당신은 바이트의 데이터를 얻을하기 만하고 원래의 배열에 복사 당신이보고 싶은 결과에 대한

byte[] tmp = someText.getBytes(); //get bytes creates a new array 
b = tmp; 

: 기본적으로 무슨 짓을하는 것은 이것이다 그러면 예상 한 동작이 생성됩니다.

관련 문제