2012-04-24 14 views
5

Necesito que mi aplicación Android guarde un archivo xml en la memoria caché externa con un nombre de archivo que contenga espacio.Guardar archivo en Android con espacios en el nombre de archivo

DOMSource source = new DOMSource(doc); 
StreamResult result = new StreamResult(new File(activity 
        .getExternalCacheDir().getAbsolutePath() 
        + "/Local storage.xml")); 

transformer.transform(source, result); 

Cuando hojeo manualmente en mi directorio de archivos puedo encontrar este archivo: "% 20storage.xml local".

Así que después cuando trato de leerlo con

File localStorageXmlFile = new File(activity.getExternalCacheDir() 
       .getAbsolutePath() 
       + "/Local storage.xml"); 

pero tengo una FileNotFoundException porque el archivo "storage.xml local" no se puede encontrar en mi dispositivo.

¿Alguna idea para resolver esto? Seb

+0

no se debe construir nombres de archivo a ti mismo, usa 'nuevo archivo (activity.getExternalCacheDir(), "storage.xml local")' - se lo hará por ti. No tengo idea de qué causa tu problema, aunque – zapl

+0

Gracias por esta respuesta, pero esto no resuelve mi problema. – grattmandu03

Respuesta

6

Era difícil identificar el origen de este problema, pero viene de StreamResult que reemplaza los espacios en el nombre del archivo por% 20. Hay un informe de error para este problema here.

Y aquí está la solución:

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(new File(activity 
       .getExternalCacheDir().getAbsolutePath() 
       + "/" + "Local storage" + ".xml")); 
    Result fileResult = new StreamResult(fos); 
    transformer.transform(source, fileResult); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} finally { 
    if (fos != null) { 
     fos.close(); 
    } 
} 

Gracias de nuevo a los dos por tratar de resolver mi problema.

+0

Gracias por la respuesta. Me salvaste el día allí. Arreglé el problema de la misma manera que tú. – slash33

1

Trate de usar la codificación URL básica:

File localStorageXmlFile = new File(activity.getExternalCacheDir() 
       .getAbsolutePath() 
       + "/Local%20storage.xml"); 

Esto ayuda mgiht que: URL encoding table

Además, cuando se trabaja con archivos, asegúrese de que está usando el separador de archivo correcto para el sistema operativo (en su caso el disco codificado/debería funcionar desde Android está basado en Linux, pero sólo para asegurarse Esto podría ser una otra opción:.

File localStorageXmlFile = new File(activity.getExternalCacheDir() 
       .getAbsolutePath() + File.separator 
       + "Local storage.xml"); 

Último recurso optin sería intentar espace el espacio. Intente reemplazar "" por "\".

+0

Intento su solución Erwald antes de publicar esta pregunta y no tengo la excepción, pero no hizo lo que esperaba. De hecho, crea un archivo xml llamado "Local% 20storage.xml" y no "Local storage.xml". – grattmandu03

+0

Eche un vistazo a mi respuesta actualizada. – Erwald

+0

Tu segunda respuesta tampoco funciona, y no puedes escapar de espacios como este "\" en java. – grattmandu03

3

Esto funciona para mí y es sólo una línea adicional de código

String fileName = "name with spaces" + ".xml";     
fileName.replace(" ", "\\ "); 
+1

¿Barras hacia adelante o hacia atrás? –

+0

Disculpa por las barras invertidas, lo corregiré. Espero que funcione para ti. –

Cuestiones relacionadas