2012-02-17 20 views
5

Intenté crear un objeto RandomAccessFile desde un archivo de recursos sin procesar en el directorio de recursos de Android sin éxito.RandomAccessFile en el archivo de recursos sin formato de Android

Solo puedo obtener un objeto inputstream a partir del archivo de recursos sin formato.

getResources().openRawResource(R.raw.file); 

¿Es posible crear un objeto RandomAccessFile de archivo activo en bruto o tengo que seguir con flujo de entrada?

+2

Yo no lo creo, porque ese archivo de recursos todavía se almacenará en el archivo APK comprimido, por lo que el InputStream que obtener es probablemente un ZipEntryInputStream. Y como está comprimido, debes leerlo como transmisión. Buscar en diferentes posiciones en el archivo probablemente no sea algo de lo que RandomAccessFile sea capaz. – Brigham

+0

"archivo de acceso aleatorio" ... y dices que no es posible buscar? – fabspro

+0

Necesita copiar el archivo a la tarjeta SD (vea http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard), luego puede usar RandomAccessFile en él . – ron

Respuesta

1

Simplemente no es posible buscar hacia delante y hacia atrás en una secuencia de entrada sin almacenar todo en memoria intermedia. Eso puede ser extremadamente costoso y no es una solución escalable para leer un archivo (binario) de algún tamaño arbitrario.

Tiene razón: idealmente, uno usaría un RandomAccessFile, pero la lectura de los recursos proporciona un flujo de entrada en su lugar. La sugerencia mencionada en los comentarios anteriores es usar la secuencia de entrada para escribir el archivo en la tarjeta SD y acceder aleatoriamente al archivo desde allí. Usted podría considerar escribir el archivo en un directorio temporal, leerlo, y eliminarlo después de su uso:

String file = "your_binary_file.bin"; 
AssetFileDescriptor afd = null; 
FileInputStream fis = null; 
File tmpFile = null; 
RandomAccessFile raf = null; 
try { 
    afd = context.getAssets().openFd(file); 
    long len = afd.getLength(); 
    fis = afd.createInputStream(); 
    // We'll create a file in the application's cache directory 
    File dir = context.getCacheDir(); 
    dir.mkdirs(); 
    tmpFile = new File(dir, file); 
    if (tmpFile.exists()) { 
     // Delete the temporary file if it already exists 
     tmpFile.delete(); 
    } 
    FileOutputStream fos = null; 
    try { 
     // Write the asset file to the temporary location 
     fos = new FileOutputStream(tmpFile); 
     byte[] buffer = new byte[1024]; 
     int bufferLen; 
     while ((bufferLen = fis.read(buffer)) != -1) { 
      fos.write(buffer, 0, bufferLen); 
     } 
    } finally { 
     if (fos != null) { 
      try { 
       fos.close(); 
      } catch (IOException e) {} 
     } 
    } 
    // Read the newly created file 
    raf = new RandomAccessFile(tmpFile, "r"); 
    // Read your file here 
} catch (IOException e) { 
    Log.e(TAG, "Failed reading asset", e); 
} finally { 
    if (raf != null) { 
     try { 
      raf.close(); 
     } catch (IOException e) {} 
    } 
    if (fis != null) { 
     try { 
      fis.close(); 
     } catch (IOException e) {} 
    } 
    if (afd != null) { 
     try { 
      afd.close(); 
     } catch (IOException e) {} 
    } 
    // Clean up 
    if (tmpFile != null) { 
     tmpFile.delete(); 
    } 
} 
+3

¿Es esta la única manera? Parece terriblemente indirecto. ¿No hay forma de obtener acceso aleatorio a un archivo de recursos en el directorio sin formato? – Fra

Cuestiones relacionadas