2012-11-28 3 views
4

왜 많은 예제가 바이트 배열을 척으로 스트림으로 읽었는지 궁금합니다.이 질문은 부드러운 질문이지만, 관심이 있습니다.청크로 스트림에 기록하는 이유는 무엇입니까?

하드웨어에 대해 조금 이해하고 있습니다. 버퍼는 매우 크기에 따라 달라질 수 있으며, 버퍼가 필요할 때마다 플러시 될 때까지 버퍼에 다시 쓰지 않아도됩니다. 플랫폼 (및 기타 현대 언어) 두 가지 예가 나와 있습니다. 언제 어느 때, 아니면 두 번째 절대 사용합니까?

var buffer = new byte[4096]; 

while (true) 
{ 
    var read = this.InputStream.Read(buffer, 0, buffer.Length); 

    if (read == 0) 
     break; 

    OutputStream.Write(buffer, 0, read); 
} 

보다는 : 나는 모두가 합법적 생각

var buffer = new byte[InputStream.Length]; 

var read = this.InputStream.Read(buffer, 0, buffer.Length); 

OutputStream.Write(buffer, 0, read); 

여기

는 것 (코드) 무슨 뜻입니까? 그렇다면 왜 while 루프의 모든 소란을 피하십시오 (구조를 결정했는지). 내가

답변

19

첫 번째 경우 필요한 메모리는 4KB입니다. 두 번째 경우에는 입력 스트림 데이터만큼 많은 메모리가 필요합니다. 입력 스트림이 4GB이면 4GB가 필요합니다.

파일 복사 작업에 4GB RAM이 필요한 경우 좋을 것 같습니까? 20GB의 디스크 이미지를 준비한다면 어떨까요?

파이프가있는 것도 있습니다. Windows에서는 자주 사용하지 않지만 다른 운영 체제에서는 비슷한 경우가 자주 발생합니다. 두 번째 경우는 모든 데이터가 읽힐 때까지 대기 한 다음 출력에 만 씁니다. 그러나 가능한 한 빨리 데이터를 쓰는 것이 좋습니다. 첫 번째 경우는 입력의 처음 4KB가 읽히 자마자 출력 스트림에 쓰기 시작합니다. 웹 페이지 제공하기 : 웹 서버가 가능한 한 빨리 데이터를 보내면 클라이언트의 웹 브라우저가 전체 본문을 기다리지 않고 머리글과 내용의 첫 부분 렌더링을 시작하도록하는 것이 좋습니다.

그러나 입력 스트림이 4kB보다 크지 않다는 것을 알고 있으면 두 경우 모두 동일합니다.

+1

일반적으로 메모리에 저장하는 양이 더 중요하므로 버퍼 (스트림)를 채우고 이동하지 않는 것은 좋지 않습니다. 방정식에서 OutputStream을 빼내고 while 루프를 사용하여 InputStream을 채운다면? 내가 이것을 보았으므로 두 번째 예와 마찬가지로 나쁠 것입니까? – tigerswithguitars

+1

모든 것은 당신이하고 싶은 일에 당신의 특정한 경우에 달려 있습니다. 작은 덩어리 (값의 합을 계산하고, 최대 값을 찾는)에서 작동 할 수있는 알고리즘이 있으며 모든 데이터가 필요한 알고리즘 (예 : 정렬)이 있습니다. 두 번째 경우에는 모든 데이터를 읽어야합니다. 첫 번째 경우에는 - 실제로는 아닙니다. – liori

+0

차가운 ... 그래서 응용 프로그램 특정, 내 주요 생각했다, 제 생각에 ...보다는 오히려 대부분의 언어에서 객체 자체의 자연. 감사합니다 :) – tigerswithguitars

2

그것은 당신의 입력 스트림이 몇 기가 바이트가 긴 상황에서 당신을 보호를 :) 수있는만큼 배우고 싶은대로 나는 악마를 재생하고

여기 옹호.

+0

보호 란 무엇을 의미합니까? 왜 그게 필요할거야? – tigerswithguitars

+0

예를 들어 OutOfMemoryException으로부터 보호합니다. – Joe

+0

오른쪽. 응용 프로그램이 액세스 할 수있는 것보다 많은 메모리에 파일을 읽는 경우 말하십시오. 주어진. 그러나 이는 많은 양의 데이터가있을 가능성이 있습니다. 따라서 패턴의 덩어리가 버퍼를 출력 스트림으로 플러시하고 재활용하는 것을 막지는 못합니다. – tigerswithguitars

2

Read이 얼마나 많은 데이터를 반환할지 모를 수 있습니다. 매우 큰 파일을 읽는 경우 이로 인해 주요 성능 문제가 발생할 수 있습니다.

입력을 제어 할 수 있고 크기가 적당하다고 확신하면 전체 배열을 한 번에 읽을 수 있습니다. 사용자가 임의의 입력을 제공 할 수 있다면 특히주의해야합니다.

5

가끔씩, InputStream.Length가 넷 전송과 같은 일부 소스에 유효하지 않거나 버퍼가 거대 할 수 있습니다 (예 : 거대한 파일에서 읽음). IMO.

+0

그게 정말 좋은 지적이야 ... 나는 그 가능성에 대해 생각하지 않았다. 그러나 이것은 많은 의미를가집니다. 특히 금속에 가깝고 정보를받는 버퍼를 읽는다면 더욱 그렇습니다! – tigerswithguitars

+0

+1 ... 2 일 수 있기를 바란다. 내가 생각하기조차하지 못했던 것을 간단하게 넣으면서이 답을 받아 들여야겠다. 항상 시원합니다. 그러나 SO 커뮤니티의 이익을 위해 대부분의 사람들에게 유용한 대답을 받아들이는 것이 가장 좋습니다. – tigerswithguitars

관련 문제