2012-12-29 94 views
1

將文件作爲字節數組讀取的最快方法是什麼?該文件大約4 MB。它位於資產目錄內,這意味着它可能是壓縮的。將文件讀取爲字節數組的最快方法

目前,我正在做這樣的事情:

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

在Android上,創建陣列需要大約40毫秒,讀取文件約120毫秒。我懷疑40毫秒主要是用零填充陣列。我能避免這種情況嗎?

該文件基本上是需要快速搜索的大約100,000個項目的列表。

+3

你是如何測量時間的?請注意,您應該記下'read'的返回值。 –

+0

謝謝,我認爲它總是儘可能地讀取。我使用一個簡單的Measure類來調用System.nanoTime()。 – fhucho

+0

您是否嘗試過使用Traceview而不是'nanoTime()'? – CommonsWare

回答

0

您可以避免使用RandomAccessFile類及其read方法創建字節數組。 Android page不是太不同,但也可能有用。我使用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

相關問題