2012-10-08 3 views
0

파일을 base64로 인코딩하기 위해이 코드를 발견했습니다. 오프셋을 사용하고 있습니다. 이 코드에 대해 이해하지 못하는 어떤읽기 호출에서 오프셋 사용에 관한 설명

File filePath = new File("/sdcard/videooutput.mp4"); 
try{ 
    FileInputStream fin=new FileInputStream(filePath); 
    long length = filePath.length(); 
    // Create the byte array to hold the data 
    byte[] bytes = new byte[(int)length]; 
    // Read in the bytes 
    int offset = 0; 
    int numRead = 0; 
    while (offset<bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset))>=0){ 
     offset += numRead; 
    } 
    // Ensure all the bytes have been read in 
    if (offset < bytes.length) { 
    throw new IOException("Could not completely read file "+filePath.getName()); 
} 


Base64.encodeToString(bytes, Base64.DEFAULT); 

while (offset < bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset)) >= 0)입니다.

누구든지 코드가 수행하려고하는 것을 설명 할 수 있습니까? 나는 오프셋이 바이트의 길이보다 적은지 그리고 나머지는 확실하지 않은지만을 확인한다.

내 다음 질문은 오프셋을 사용하여 파일을 인코딩하는 이유는 무엇입니까?

이 질문에 대한 답변은 정말 도움이 될 것입니다. 이 유형의 질문에 대해 유감스럽게 생각하지만이 코드를 이해해야합니다.

+0

오프셋은 "파일을 인코딩하는 데 사용되지 않습니다", 파일을 읽는 곳의 카운터입니다. 컴퓨터 재생 : 코드가 코드에서 실행될 때 변수 값을 적어 두십시오. 제공되는 코드 스 니펫에는 인코딩이 없습니다. –

+1

'offset'을 사용하는 대신'DataInputStream'을 사용할 수 있습니다 –

+0

그건 base64로 인코딩하지 않습니다. 그렇게하고 싶다면 핵심'javax.xml.bind.DataConverter' 또는 Apache Commons Codec을 사용할 수 있습니다. – LanguagesNamedAfterCofee

답변

1

InputStream#read()

int numRead=fin.read(bytes, offset, bytes.length-offset)

판독는이 지정된 바이트의 양, 지정된 오프셋에서 시작하는 지정된 바이트 배열을 채운다. 그러나 100 바이트를 요청하더라도이를 얻을 수 있다는 보장은 없습니다. 따라서이 코드는 기본적으로 read()를 호출 할 때마다 오프셋을 증가시킵니다.

초기화 호출은 [] 바이트를 완전히 채 웁니다. 실패하면, 성공적으로 복사 된 바이트 수만큼 오프셋을 앞으로 이동시키고 새로운 오프셋에서 시작하여 바이트 []를 채 웁니다. 각각의 새로운 시도는 버퍼에 남아있는 것을 채우기에 충분할 정도로만 읽기를 시도합니다.

+0

@Greg 감사합니다. 그래서, 내가 이것으로부터 이해하는 것을 되돌아 보도록하겠습니다. offset은 파일을 읽는 시작점입니다. 한편, 바이트는 모든 읽기 바이트를 배치 한 위치입니다. 그래서, 내가 읽은 바이트의 값을 얻으려면, 바이트를 사용해야합니다. 내가 맞습니까? –

+0

마지막 싱글 바이트 읽기를 원한다면, 그것은'bytes [offset - 1]'에있게됩니다. 그렇지 않으면 모든 읽기 내용은 배열의 'bytes []'루프 끝까지있게됩니다. 그래서 당신은 그 배열에서 마지막 내용을 볼 수 있습니다. –

관련 문제