마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

while 문안에서 스트림 읽을 시 질문입니다.

0 추천

파일 다운로드시 무조건 버퍼를 4096 사이즈 만큼 채우고 파일을 생성하는 코드를 짜고 있습니다. 감사하게도 여러분의 도움을 크게 받고 있습니다. 

현재 코드는 다음과 같습니다.

 

int read = 0;
                int off = 0;
                int length = 4096;
                byte[] buffer = new byte[4096];
                boolean done = false;
                while(!done) {

                    while (length > 0) {
                        read = isVideo.read(buffer, off, length);
                        if (read <= 0) {
                            done = true;
                            break;
                        }
                        length -= read;
                    }
                    Log.d(TAG, "readSize: " + read);
                    existVideo.write(combineByteArray(buffer, getDivSwapCnt()), 0, read);
                    value += read;
                    progressDialog.setProgress((int) (value / fileSize * 100));
                }

헌데 문제는 read 는 4096 으로 잘 나오지만 너무 많이 수행을 한다는 것입니다. 148mb 짜리 파일이 너무 큰 용량으로 생성된다는 건데요. 어느쪽이 문제 인지 궁금합니다. 

준버기 (1,160 포인트) 님이 2018년 7월 11일 질문

1개의 답변

+1 추천
 
채택된 답변
off 값도 이상하고,   read 값도 다른 듯 합니다.

off 값이 변경 되지 않으니, 계속 off 위치부터 버퍼 읽어질테구.

어떻게든  buffer 는 4096 채워질텐데.. read는 처음 4095 읽고, 두번째 1 만큼 읽은다면,

Log.d(TAG, "readSize: " + read); 이  1이 찍히고,  밑의 수식이 다 원하는 동작을 하지 않을 듯 합니다.

특히 existVideo.write(combineByteArray(buffer, getDivSwapCnt()), 0, read); 는 어떤 동작을 하는지, 코드만 봐서는 알 수 없는데.. 아마 더 큰 사이즈로 저장 된다면, 이 부분이 오동작 할 것으로 생각됩니다.

 

우선 문제로 보이는 대로만 수정한 코드입니다.

                int read = 0;
                int off = 0;
                int length = 4096;
                int totalRead = 0;
                byte[] buffer = new byte[4096];
                boolean done = false;
                while(!done) {
 
                    while (length > 0) {
                        read = isVideo.read(buffer, off, length);
                        if (read <= 0) {
                            done = true;
                            break;
                        }
                        length -= read;
                        totalRead += read;
                        off += read;
                    }
                    Log.d(TAG, "readSize: " + totalRead);
                    existVideo.write(combineByteArray(buffer, getDivSwapCnt()), 0, totalRead);
                    value += totalRead;
                    progressDialog.setProgress((int) (value / fileSize * 100));
                }
익명사용자 님이 2018년 7월 11일 답변
준버기님이 2018년 7월 11일 채택됨
정말 감사합니다! 큰 도움 되었습니다!
...