2015-05-09 16 views
5

Ich habe eine Datenstruktur implementiert, die auf meinem Computer funktioniert und jetzt versuche ich es in meine Android-Anwendung zu portieren. Ich öffne eine rohe .dat Ressource und eine InputStream bekommen, aber ich brauche eine FileInputStream zu bekommen:Müssen AssetInputStream in FileInputStream konvertieren

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); 
... 

Der obige Code führt die folgende Ausnahme, da ein Input nicht auf ein Fileinputstream gegossen werden kann, aber das ist genau das, was ich brauche:

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

All mein Code ist auf diese FileChannel mit einem FileInputStream bauen, also möchte ich es weiter verwenden. Gibt es einen Weg von einem InputStream von context.getResources().openRawResource(fileID) zu gehen und es dann in einen FileChannel umzuwandeln?


Etwas relevante Beiträge, in denen ich nicht eine funktionierende Lösung für meinen Fall, android finden konnte:

How to convert InputStream to FileInputStream

Converting inputStream to FileInputStream?

Using FileChannel to write any InputStream?


+2

nein, Ressource-Dateien sind keine „normale“ Dateien, dh sie in einem nicht existieren Dateisystem – pskink

+0

Ich habe 2 Wochen daran gearbeitet. Wenn ich das nicht zur Arbeit bringen kann, werde ich noch mindestens 2 weitere Wochen lachen. – Joop

+1

Warum können Sie InputStream nicht einfach verwenden? – pskink

Antwort

6

Eine Ressource ist keine Datei. Ergo kann es nicht als Memory-Mapped-Datei verwendet werden. Wenn Sie über Ressourcen verfügen, die so groß sind, dass sie speicherplatziert werden müssen, sollten sie wahrscheinlich überhaupt keine Ressourcen sein. Und wenn sie klein sind, bringt das Speichermapping keine Vorteile.

0

Das könnte spät sein, aber ich denke, dass Sie indirekt einen FileInputStream von einem InputStream erhalten können. Was ich vorschlage, ist dies: Holen Sie den Input-Stream von der Ressource, dann erstellen Sie eine temporäre Datei, erhalten Sie einen FileOutputStream von ihm. lese den InputStream und kopiere ihn in FileOutputStream.

Jetzt hat die temporäre Datei den Inhalt Ihrer Ressourcendatei und Sie können jetzt einen FileInputStream aus dieser Datei erstellen.

Ich weiß nicht, ob diese bestimmte Lösung für Sie nützlich ist, aber ich denke, dass es in anderen Situationen verwendet werden kann. Als Beispiel, wenn Sie Ihre Datei im Ordner Assets ist, erhalten Sie einen Inputstream und dann ein Fileinputstream mit dieser Methode:

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); 
Verwandte Themen