2015-05-09 12 views
5

Ho implementato una struttura dati che sta funzionando sul mio computer e ora sto cercando di portarlo nella mia applicazione Android. Apro una risorsa grezza .dat e ottenere un InputStream, ma ho bisogno di ottenere un FileInputStream:È necessario convertire AssetInputStream in FileInputStream

FileInputStream fip = (FileInputStream) context.getResources().openRawResource(fileID); 
FileChannel fc = fip.getChannel(); 
long bytesSizeOfFileChannel = fc.size(); 
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0L, bytesSizeOfFileChannel); 
... 

Il codice di cui sopra genera la seguente eccezione in quanto un InputStream non può essere lanciato ad un FileInputStream ma questo è solo quello che mi serve:

java.lang.ClassCastException: android.content.res.AssetManager$AssetInputStream cannot be cast to java.io.FileInputStream 

Tutto il mio codice si basa sull'uso di questo FileChannel con un FileInputStream, quindi voglio continuare a utilizzarlo. C'è un modo per passare dallo InputStream allo context.getResources().openRawResource(fileID) e quindi convertirlo in un FileChannel?


messaggi po 'rilevanti in cui non riuscivo a trovare una soluzione di lavoro per il mio caso, che Android:

How to convert InputStream to FileInputStream

Converting inputStream to FileInputStream?

Using FileChannel to write any InputStream?


+2

no, i file di risorse non sono i file "normali", cioè essi non esiste in un file system – pskink

+0

Ho lavorato 2 settimane su questo. Se non riesco a farlo funzionare, riderò per almeno altre 2 settimane. – Joop

+1

perché non puoi semplicemente usare InputStream? – pskink

risposta

6

Una risorsa non è un file. Ergo non può essere utilizzato come file mappato in memoria. Se hai risorse così enormi da essere mappate in memoria, probabilmente non dovrebbero essere affatto risorse. E se sono piccoli, la mappatura della memoria non porta vantaggi.

0

Questo potrebbe essere tardi, ma penso che si possa ottenere indirettamente un FileInputStream da un InputStream. ciò che suggerisco è questo: ottenere il flusso di input dalla risorsa, quindi creare un file temporaneo, ottenere un FileOutputStream da esso. leggere l'InputStream e copiarlo su FileOutputStream.

ora il file temp contiene il contenuto del file di risorse e ora è possibile creare un FileInputStream da questo file.

Non so se questa particolare soluzione ti sia utile, ma penso che possa essere utilizzata in altre situazioni. Per fare un esempio, se il file si trova nella cartella attivi, si ottiene un InputStream e poi un FileInputStream con questo metodo:

InputStream is=getAssets().open("video.3gp"); 
File tempfile=File.createTempFile("tempfile",".3gp",getDir("filez",0)); 

FileOutputStream os=newFileOutputStream(tempfile); 
byte[] buffer=newbyte[16000]; 
int length=0; 
while((length=is.read(buffer))!=-1){ 
os.write(buffer,0,length); 
} 

FileInputStream fis=new FileInputStream(tempfile);