2011-04-23 21 views
29

trato de guardar un archivo txt en mi carpeta, en el almacenamiento interno, pero se enfrentan al mismo problema cada vez:Guardar archivo interno en mi propia carpeta interna en Android

"Fuente no encontrada"

Escribo mi código de diferentes maneras expresadas aquí de la siguiente manera, pero en todos los sentidos tengo el mismo problema.

Vale la pena decir que incluso agrego

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

en Manifest.xml que no es necesario para el almacenamiento interno.

Es innecesario decir que no tengo ningún problema para guardar archivos en /datos/datos/paquetes/archivos camino, pero cuando agrego mi carpeta en la raíz de los archivos, por ejemplo, /datos/data/package/files/myforlder/myfile.txt Me enfrento al problema de "Fuente no encontrada".

¿Podría indicarme la dirección correcta para solucionar esto?

La segunda pregunta es que, para guardar un archivo en una carpeta externa en el almacenamiento externo.
(por ejemplo: tarjeta SD o almacenamiento USB) ¿Es el escenario diferente o es el mismo?

primera manera:

OutputStreamWriter out; 
try { 
    File path=new File(getFilesDir(),"myfolder"); 
    File mypath=new File(path,"myfile.txt"); 
    if (!mypath.exists()) { 
     out = new OutputStreamWriter(openFileOutput(mypath.getAbsolutePath() , MODE_PRIVATE)); 
     out.write("test"); 
     out.close(); 
    }       
} 

Segunda forma:

OutputStreamWriter out; 
try { 
    ContextWrapper cw = new ContextWrapper(this); 
    File path = cw.getDir("myfolder", Context.MODE_PRIVATE); 
    if (!path.exists()) { 
     path.createNewFile(); 
     path.mkdir(); 
    } 
    File mypath=new File(path,"myfile.txt"); 
    if (!mypath.exists()) { 
     out = new OutputStreamWriter(openFileOutput(mypath.getAbsolutePath() , MODE_PRIVATE)); 
     out.write("test"); 
     out.close(); 
    } 
} 

Tercera forma:

File path=getFilesDir(); 
String mypath=path.toString() + "/myfolder"; 
OutputStreamWriter out; 
try { 
    File f = new File(mypath , "/myfile.txt" ); 
out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();     
    } 

Cuarta Vía:

File path=getFilesDir(); 

OutputStreamWriter out; 
    try { 
    File f = new File(path.getPath() + "/myfolder/myfile.txt" ); 
    out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();      
    } 

Quinto manera:

File path=getFilesDir();     
OutputStreamWriter out; 
try { 
    File f = new File(path.getCanonicalPath() + "/myfile.txt"); 
    out = new OutputStreamWriter(openFileOutput(f.getPath(), MODE_PRIVATE)); 
    out.write("test"); 
    out.close();      
    } 
+1

Mientras escribe su pregunta, seleccione el código y presione ctrl + k, esto autoinderte y coloreará su código , entonces eso es mucho más legible Nadie querrá leer ese código sin haber sido descolocado ni incoloro. –

Respuesta

55

primera manera:

no creó el directorio. Además, está pasando una ruta absoluta al openFileOutput(), lo cual es incorrecto.

Segunda forma:

Se crea un archivo vacío con el nombre deseado, que luego le impidió crear el directorio. Además, está pasando una ruta absoluta al openFileOutput(), lo cual es incorrecto.

Tercera forma:

no creó el directorio. Además, está pasando una ruta absoluta al openFileOutput(), lo cual es incorrecto.

Cuarta Vía:

no creó el directorio. Además, está pasando una ruta absoluta al openFileOutput(), lo cual es incorrecto.

Quinto manera:

no creó el directorio. Además, está pasando una ruta absoluta al openFileOutput(), lo cual es incorrecto.

manera correcta:

  1. Crear una File para su directorio deseado (por ejemplo, File path=new File(getFilesDir(),"myfolder");)
  2. llamada mkdirs() en ese File para crear el directorio si no existe
  3. Crear una File para el archivo de salida (p. ej., File mypath=new File(path,"myfile.txt");)
  4. Use standard Java I/O para escribir en ese File (p. ej., usando new BufferedWriter(new FileWriter(mypath)))
+0

es ese archivo y carpeta creados en la memoria interna o tarjeta sd? – Shoshi

+0

@Shoshi: 'getFilesDir()' representa el almacenamiento interno. – CommonsWare

+0

thankx. @CommonsWare – Shoshi

10

Guardar:

public boolean saveFile(Context context, String mytext){ 
    Log.i("TESTE", "SAVE"); 
    try { 
     FileOutputStream fos = context.openFileOutput("file_name"+".txt",Context.MODE_PRIVATE); 
     Writer out = new OutputStreamWriter(fos); 
     out.write(mytext); 
     out.close(); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

carga:

public String load(Context context){ 
    Log.i("TESTE", "FILE"); 
    try { 
     FileInputStream fis = context.openFileInput("file_name"+".txt"); 
     BufferedReader r = new BufferedReader(new InputStreamReader(fis)); 
     String line= r.readLine(); 
     r.close(); 
     return line; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("TESTE", "FILE - false"); 
     return null; 
    } 
} 
1

La respuesta de Mintir4 está bien, lo haría en la carga de hacer lo siguiente (con el fin de leer todas las líneas)

FileInputStream fis = myContext.openFileInput(fn); 
BufferedReader r = new BufferedReader(new InputStreamReader(fis)); 
String s = ""; 
while ((s = r.readLine()) != null) { 
    txt += s; 
} 
r.close(); 
+1

por favor edite su respuesta y formatee el código para hacerlo legible – kleopatra

Cuestiones relacionadas