2012-12-29 3 views
1

파일을 (Android에서) 바이트 배열로 읽는 가장 빠른 방법은 무엇입니까? 파일은 약 4MB입니다. 애셋 디렉토리 안에있어 압축 된 것 같습니다.바이트 배열로 파일을 읽는 가장 빠른 방법

현재,이 같은 일을 해요 : 안드로이드에

byte[] buffer = new byte[4 * 1024 * 1024]; 
context.getAssets().open(FILE_NAME).read(buffer); 

을, 배열이 약 120 밀리 파일을 읽는 약 40 밀리 초 소요 생성. 나는 40ms가 대부분 0으로 배열을 채우는 것으로 구성되어 있다고 생각한다. 이 문제를 피할 수 있습니까?

파일은 기본적으로 빠르게 검색해야하는 약 100,000 개의 항목 목록입니다.

+3

시간은 어떻게 측정합니까? 'read'의 반환 값에 주목해야합니다. –

+0

감사합니다. 나는 항상 가능한 한 많이 읽는다고 생각했습니다. System.nanoTime()을 호출하는 간단한 Measure 클래스를 사용합니다. – fhucho

+0

'nanoTime()'대신 Traceview를 사용해 보셨습니까? – CommonsWare

답변

0

read 메서드와 함께 RandomAccessFile 클래스를 사용하여 바이트 배열을 만들지 않도록 할 수 있습니다. android page도별로 다르지 않지만 유용 할 수도 있습니다. 나는 특정 파일에서 원할 때마다 데이터를 저장하고 검색하는 프로젝트에 RAF를 사용했다. RAF는 이러한 작업에 매우 유용합니다. 그러나 읽기 및 쓰기가 많을수록 실행 시간이 상당히 늘어납니다. 사용 예는 다음과 같습니다.

import java.io.RandomAccessFile; 
import java.io.FileNotFoundException; 

public class RAFTest { 

    public static void main(String[] args) { 
     RandomAccessFile raf; 
     String metadata = "This is a test file."; 

     try { 

      raf = new RandomAccessFile(args[0], "rw"); 
      raf.writeUTF(metadata); 
      int[] nums = new int[10]; 
      for(int i = 0; i < b.length; i++) { 
       nums[i] = i; 
       raf.writeInt(nums[i].getValue()); 
      } 

      raf.seek(0); // force pointer to beginning 

      System.out.println(raf.readUTF()); 
      int[] c = new int[5]; 
      int byteJump = 4; 
      for(int i = 0; i < c.length; i++) { 
       raf.seek(raf.getFilePointer() + byteJump); 
       c[i] = raf.readInt(); 
       System.out.println(c[i]); 
      } 

     } catch(Exception ex) { } 
    } 
} 
+0

감사합니다. 불행히도 사용자가 키보드의 키를 누를 때마다 파일의 항목을 정말 빨리 필터링해야합니다 (10 밀리 초 이하가 좋음). 현재는 하나의 미세 최적화 된 루프 (예 : 메서드 호출 없음)에서 수행합니다. 어떤 IO도 문제가되지 않습니다 :) – fhucho

관련 문제