2015-05-09 17 views
5

Mam zaimplementowaną strukturę danych, która działa na moim komputerze, a teraz próbuję przenieść ją do mojej aplikacji na Androida. I otworzyć surowego .dat zasobów i uzyskać InputStream ale muszę dostać FileInputStream:Konwersja pliku AssetInputStream na 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); 
... 

Powyższy kod rzuca następujący wyjątek od InputStream nie mogą być oddane do FileInputStream ale to właśnie to, czego potrzebuję:

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

Cały mój kod jest zbudowany na użyciu tego FileChannel z FileInputStream, więc chcę go nadal używać. Czy istnieje sposób, aby przejść od posiadania InputStream z context.getResources().openRawResource(fileID), a następnie przekonwertować go na FileChannel?


Nieco odpowiednich stanowisk, w których nie mogłem znaleźć roztwór roboczy o moim przypadku których android:

How to convert InputStream to FileInputStream

Converting inputStream to FileInputStream?

Using FileChannel to write any InputStream?


+2

nie, pliki zasobów nie są „normalne” plików, to one nie istnieją w sposób system plików – pskink

+0

Pracuję nad tym 2 tygodnie. Jeśli nie będę mógł tego zrobić, będę się śmiał przez co najmniej 2 tygodnie. – Joop

+1

dlaczego nie możesz po prostu użyć InputStream? – pskink

Odpowiedz

6

Zasób nie jest plikiem. Ergo nie może być używany jako plik mapowany w pamięci. Jeśli masz zasoby, które są tak ogromne, że muszą być mapowane na pamięć, prawdopodobnie nie powinny być zasobami w ogóle. A jeśli są małe, mapowanie pamięci nie przynosi żadnych korzyści.

0

Może być późno, ale myślę, że można pośrednio uzyskać FileInputStream z InputStream. sugeruję to: pobierz strumień wejściowy z zasobu, a następnie utwórz plik tymczasowy, pobierz z niego plik FileOutputStream. przeczytaj InputStream i skopiuj go do FileOutputStream.

teraz plik tymczasowy zawiera zawartość pliku zasobów, a teraz można utworzyć plik FileInputStream z tego pliku.

Nie wiem, czy to konkretne rozwiązanie jest dla ciebie przydatne, ale myślę, że może być użyte w innych sytuacjach. Jako przykład, jeśli plik znajduje się w folderze aktywów, można uzyskać InputStream, a następnie FileInputStream użyciu tej metody:

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