2015-05-20 23 views
7

So come utilizzare il AssetManager per leggere un File dalla directory res/raw con una InputStream, ma per il mio caso d'uso speciale Ho bisogno di un FileInputStream. Il motivo per cui ho bisogno di un FileInputStream è perché ho bisogno di ottenere l'oggetto FileChannel da esso chiamando getChannel().Come arrivare FileInputStream di file nella cartella di asset

Questo è il codice che ho finora, legge i dati (nel mio caso un elenco di primitive) da un File:

public static int[] loadByMappedBuffer(Context context, String filename) throws IOException{ 
    FileInputStream fis = context.openFileInput(filename); 
    FileChannel ch = fis.getChannel(); 

    MappedByteBuffer mbuff = ch.map(MapMode.READ_ONLY, 0, ch.size()); 
    IntBuffer ibuff = mbuff.asIntBuffer(); 

    int[] array = new int[ibuff.limit()]; 
    ibuff.get(array); 

    fis.close(); 
    ch.close(); 

    return array; 
} 

avevo cercato di creare File da un Uri, ma che appena si traduce in un FileNotFoundException:

Uri uri = Uri.parse("android.resource://com.example.empty/raw/file"); 
File file = new File(uri.getPath()); 
FileInputStream fis = new FileInputStream(file); 

c'è un modo posso ottenere un FileInputStream ad un File nella directory res/raw?

+0

Penso che il vostro URL è l'problem.And si dovrebbe aggiungere dalla directory beni. –

+0

Quindi tutto ciò che serve è leggere il contenuto del file come array int. Ho ragione? – Ayzen

+0

@Ayzen sì, ma ho bisogno di renderlo veloce, metodo, che ho dato legge 80K * 4 byte e trasformarlo in array int da 6-7 ms sul mio PC –

risposta

9

È possibile ottenere un FileInputStream a una risorsa nel vostro patrimonio come questo:

AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName); 
FileInputStream stream = fileDescriptor.createInputStream(); 

Il fileName fornite a openFd() dovrebbe essere il percorso relativo al bene, lo stesso fileName si fornire al open().

In alternativa è anche possibile creare il FileInputStream in questo modo:

AssetFileDescriptor assetFileDescriptor = assetManager.openFd(fileName); 
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor(); 
FileInputStream stream = new FileInputStream(fileDescriptor); 
Problemi correlati