• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

파일 입출력에 대해 질문 드립니다.

21.09.22 18:47 작성 조회수 149

0

안녕하세요!

네이버 지도 이미지 가져올 때

지도 이미지를 byte 배열로 읽어와서 직접 만든 파일에 쓰는 작업을 하는 부분에서

 

int read = 0;

byte[] bytes = new byte[1024];

 
(1)
while ((read = is.read(bytes)) != -1) {
outputStream.write(bytes, 0, read); 
}
 
(2)
while ((read = is.read(bytes)) != -1) {
outputStream.write(read); 
}
 
실행해보면 기능은 둘 다 정상적으로 작동하는 것 같은데
(1)과 (2)의 차이점을 자세히 설명해주실 수 있나요?
 
감사합니다.

답변 2

·

답변을 작성해보세요.

0

1번은  byte배열(크기:1024)이 저장된 데이터를 0(맨처음부터), read(읽어들인 바이트수)만큼 write하는 것이기 때문에 byet배열에 정확하게 읽어들인 바이트수 만큼 write를 하니다. 그러면 1024보다 적은 데이터인경우 byte배열에서  없는 데이터에 접근할 필요가 없습니다.

2번 부분은  

(2) while ((read = is.read(bytes)) != -1) {
outputStream.write(bytes); 
}
이렇게 되어야 되는것 아닌지요? 이경우는 byte배열(크기:1024)전체를 write하기 때문에 크기가 1024보다 적은경우에도 byte배열(크기:1024)에 불필요한 공간을 접근하게 된다고 보시면 될듯합니다.

따라서 1번 부분처럼 write를 하는 것이 더 효율적이라고 보시면 됩니다.

0

네 이미지가 용량이 클경우 다운로드 속도가 느려질수 있습니다. 그래서 byte배열(버퍼역할)에 저장하여 다운로드하면 속도가 조금 빠를 수있어서 바이트 배열을 사용하는것이 바람직합니다.  예를들면 마트에서 카트없이 물건을 사면 카운터에 여러번 왔다갔다 해야되는데 카트가 있으면 한번에 카운터로 옮기는 거와 비슷하다고 생각하시면 될듯합니다.위에서는 카트의 크기가 1024 바이트입니다.

이해가 되셨을까요?

키보드님의 프로필

키보드

질문자

2021.09.22

답변 감사합니다!

byte 배열에 담아서 한번에 읽는 것이 한 바이트씩 읽는 것보다 더 효율적이라는 것은 이해가 됐습니다.

(1) while ((read = is.read(bytes)) != -1) {
outputStream.write(bytes, 0, read); 
}
 
(2) while ((read = is.read(bytes)) != -1) {
outputStream.write(read); 
}

그럼 쓰는 과정도 읽는 과정과 똑같이 (2)는 한 바이트씩 쓰는 과정으로 이해하고, (1)은 바이트 배열 만큼 써주는 과정으로 이해하면 될까요?

바이트 배열만큼 읽어오는 코드는 이해가 되는데 쓰는 과정, 특히 저 하이라이트 된 인자 부분의 코드 상의 의미 차이를 잘 모르겠습니다.