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();
}
}
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
"archivo de acceso aleatorio" ... y dices que no es posible buscar? – fabspro
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