2011-08-09 5 views
14
AssetManager mngr = getAssets(); 
test_file = mngr.open("sample.txt"); 

anterior test_file variable es de tipo InputStream. ¿Alguna forma de calcular el tamaño del archivo de sample.txt a partir de él?Tamaño del archivo que obtenemos mediante la función AssetManager getAssets en Android

+0

por favor, haga un poco más de esfuerzo para hacer preguntas. Intente leer las preguntas frecuentes http://stackoverflow.com/faq para obtener más información sobre cómo hacer preguntas – Janusz

+0

Ok, gracias por la información. – Dominic

Respuesta

-2

Creo que esto va a funcionar para usted:

test_file.available(); 

Android sitio para desarrolladores:

final int available() 
Returns an estimated number of bytes that can be read or skipped without blocking for more input. 
+0

Gracias, funciona bien. Corrección pequeña, habrá test_file.available() en lugar de mngr.available(). – Dominic

+0

Sí, correcto. Disculpe mi error. – hardartcore

+17

-1 Esta no es una forma segura de verificar el tamaño del archivo, ya que solo está disponible el resto de los datos almacenados en el búfer que pueden ser o no el tamaño del archivo. –

46

tengo una alternativa para obtener el tamaño de un archivo en activos usando AssetFileDescriptor:

AssetFileDescriptor fd = getAssets().openFd("test.png"); 
Long size = fd.getLength(); 

Espero que ayude.

+0

ya que también funciona. Gracias .. – Dominic

+0

funciona aún mejor !! Gracias – nurxyz

+9

Nota breve: Esto no funciona para los activos comprimidos (obtendrá una excepción) pero la solución aceptada también funciona para los activos comprimidos y devolverá el tamaño sin comprimir (que es justo lo que queremos). – jek

1
test_file.available(); 

No es un método muy confiable para obtener la longitud del archivo como se indica en los documentos.

size = fd.getLength(); 

¡Usando el FileDescriptor como lo muestra Ayublin!

Su respuesta debe ser promocionada a la respuesta correcta.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ reseña/mensajes de baja calidad/17437638) – igr

0

inputStream.available() puede coincidir con el tamaño del archivo si el archivo es muy pequeño, pero para archivos más grandes no se espera que coincida.

Para un activo comprimido, la única forma de obtener el tamaño confiablemente es copiarlo en el sistema de archivos, por ejemplo: context.getCacheDir() y luego leer la longitud del archivo desde allí. Aquí hay un código de muestra que hace esto. Probablemente también tenga sentido usar el archivo del directorio de caché en lugar de los activos después de esto.

String filename = "sample.txt"; 
InputStream in = context.getAssets().open(filename); 
File outFile = new File(context.getCacheDir(), filename); 
OutputStream out = new FileOutputStream(outFile); 

try { 
    int len; 
    byte[] buff = new byte[1024]; 
    while ((len = in.read(buff)) > 0) { 
     out.write(buff, 0, len); 
    } 
} finally { 
    // close in & out 
} 
long theRealFileSizeInBytes = outFile.length(); 

También debe eliminar el archivo desde el directorio de caché cuando haya terminado con él (y todo el directorio caché también se eliminarán de forma automática cuando se desinstala la aplicación).

Cuestiones relacionadas