2012-05-01 13 views
16

Tengo un archivo de texto en la carpeta de activos que necesito convertir en un objeto File (no en InputStream). Cuando probé esto, obtuve la excepción "no such file":Android: ¿cómo creo un objeto File desde el archivo de activos?

String path = "file:///android_asset/datafile.txt"; 
URL url = new URL(path); 
File file = new File(url.toURI()); // Get exception here 

¿Puedo modificar esto para que funcione?

Por cierto, en cierto modo me trataron de "código con el ejemplo" mirar el siguiente fragmento de código en mi proyecto en otro lugar que hace referencia a un archivo HTML en la carpeta de activos

public static Dialog doDialog(final Context context) { 
WebView wv = new WebView(context);  
wv.loadUrl("file:///android_asset/help/index.html"); 

Lo que admitir que yo no entiendo completamente el mecanismo anterior, así que es posible que lo que estoy tratando de hacer no funcione.

Thx!

+0

¿Por qué quiere leer en un objeto del archivo? Creo que debes tomar los datos del activo como un InputStream y escribirlos como un outputStream que apunta a una ubicación física. Luego puede abrirlo como un objeto File. http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard – Gophermofur

+0

Estoy tratando de evitar hacer copias del archivo de activos, pero lo haré si todo otro falla La razón por la que necesito un archivo es porque se usa como argumento en un ctor cuyo código no tengo acceso, y ese es el único ctor que existe para esa clase. –

+0

Ah, eso tiene sentido. Quizás: haga la copia en SDCARD, páselo \ al constructor y elimínelo una vez que haya terminado. Si el archivo es el mismo y siempre lo guarda en la misma ubicación en SDCARD, solo haría 1 copia (simplemente sobrescribiría la versión anterior). – Gophermofur

Respuesta

23

No puede obtener un objeto File directamente de un activo, porque el activo no se almacena como un archivo. Deberá copiar el activo en un archivo y luego obtener un objeto File en su copia.

+6

Sí, entonces ¿cómo haces eso? –

+0

@MarkMolina: vea la otra respuesta. Es prácticamente el estándar Java I/O, usando un 'InputStream' del' método open() 'en' AssetManager', y luego copiando los datos del 'InputStream' en un' OutputStream' para el archivo deseado. – CommonsWare

8

No puede obtener un objeto File directamente de un activo.

primer lugar, obtener un InputStream de su activo utilizando, por ejemplo AssetManager#open

A continuación, copie el flujoEntrada:

public static void writeBytesToFile(InputStream is, File file) throws IOException{ 
    FileOutputStream fos = null; 
    try { 
     byte[] data = new byte[2048]; 
     int nbread = 0; 
     fos = new FileOutputStream(file); 
     while((nbread=is.read(data))>-1){ 
      fos.write(data,0,nbread);    
     } 
    } 
    catch (Exception ex) { 
     logger.error("Exception",ex); 
    } 
    finally{ 
     if (fos!=null){ 
      fos.close(); 
     } 
    } 
} 
0

Esta función faltante en el código. @wadali

private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int read; 
    while((read = in.read(buffer)) != -1){ 
     out.write(buffer, 0, read); 
    } 
} 

Fuente: https://stackoverflow.com/a/4530294/4933464

Cuestiones relacionadas