java.lang.IllegalArgumentException: contiene un separador de ruta

79

Tengo un nombre de archivo en mi código como:

String NAME_OF_FILE="//sdcard//imageq.png";
FileInputStream fis =this.openFileInput(NAME_OF_FILE); // 2nd line

Recibo un error en la segunda línea:

05-11 16: 49: 06.355: ERROR / AndroidRuntime (4570): Causado por: java.lang.IllegalArgumentException: El archivo //sdcard//imageq.png contiene un separador de ruta

Probé este formato también:

String NAME_OF_FILE="/sdcard/imageq.png";
MAMurali
fuente

Respuestas:

58

Este método abre un archivo en el área de datos privados de la aplicación. No puede abrir ningún archivo en subdirectorios en esta área o desde otras áreas usando este método. Así que use el constructor de FileInputStreamdirectamente para pasar la ruta con un directorio en ella.

Stephan
fuente
46
Proporcione un ejemplo para esto
Anand Savjani
11
Tu respuesta es confusa; OP está utilizando un FileInputStream
FracturedRetina
7
proporcionar un ejemplo
Lutaaya Huzaifah Idris
2
Explique la respuesta.
IgorGanapolsky
1
esta es la respuesta incorrecta; consulte la respuesta a continuación
bharal
81

La solucion es:

FileInputStream fis = new FileInputStream (new File(NAME_OF_FILE));  // 2nd line

El método openFileInput no acepta separadores de ruta.

No te olvides de

fis.close();

al final.

runix
fuente
Dado que uno puede usar FileInputStreamasí, ¿por qué elegir usarlo openFileInput?
Al Lelopath
1
Esta debería ser la respuesta correctamente marcada porque proporciona un ejemplo claro.
marienke
Las soluciones simples son las mejores. Gracias.
Danger
30

openFileInput()no acepta rutas, solo un nombre de archivo si desea acceder a una ruta, use File file = new File(path)y correspondienteFileInputStream

reflog
fuente
39
¡Sería genial si hubiera proporcionado algún código de muestra para lograr esto!
Muhammad Babar
2
@MuhammadBabar, por supuesto, necesita código, no siempre puede codificar sin que alguien le proporcione uno. ¿Quizás consultar los documentos?
Neon Warge
3

Recibí el mensaje de error anterior al intentar acceder a un archivo desde el almacenamiento interno usando el openFileInput("/Dir/data.txt")método con subdirectorio Dir.

No puede acceder a los subdirectorios utilizando el método anterior.

Prueba algo como:

FileInputStream fIS = new FileInputStream (new File("/Dir/data.txt"));
Swaran Gõdlã
fuente
2

No puede usar la ruta con separadores de directorio directamente, pero tendrá que crear un objeto de archivo para cada directorio.

NOTA: Este código crea directorios, es posible que el suyo no lo necesite ...

File file= context.getFilesDir();
file.mkdir();

String[] array=filePath.split("/");
for(int t=0; t< array.length -1 ;t++)
{
    file=new File(file,array[t]);
    file.mkdir();
}

File f=new File(file,array[array.length-1]);

RandomAccessFileOutputStream rvalue = new RandomAccessFileOutputStream(f,append);
usuario1389698
fuente
5
Qué ? File f = new File(fileDirPath); f.mkdirs();Edite
Mr_and_Mrs_D
1
String all = "";
        try {
            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String strLine;
            while ((strLine = br.readLine()) != null){
                all = all + strLine;
            }
        } catch (IOException e) {
            Log.e("notes_err", e.getLocalizedMessage());
        }
Dyno Cris
fuente
0
File file = context.getFilesDir(); 
file.mkdir();
String[] array = filePath.split("/"); 
for(int t = 0; t < array.length - 1; t++) {
    file = new File(file, array[t]); 
    file.mkdir();
}
File f = new File(file,array[array.length- 1]); 
RandomAccessFileOutputStream rvalue = 
    new RandomAccessFileOutputStream(f, append);
Muhammad syukur
fuente
Misma respuesta que la anterior.
Anis LOUNIS
0

Resolví este tipo de error creando un directorio en el evento onCreate, luego accediendo al directorio creando un nuevo objeto de archivo en un método que necesita hacer algo como guardar o recuperar un archivo en ese directorio, ¡espero que esto ayude!

 public class MyClass {    

 private String state;
 public File myFilename;

 @Override
 protected void onCreate(Bundle savedInstanceState) {//create your directory the user will be able to find
    super.onCreate(savedInstanceState);
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        myFilename = new File(Environment.getExternalStorageDirectory().toString() + "/My Directory");
        if (!myFilename.exists()) {
            myFilename.mkdirs();
        }
    }
 }

 public void myMethod {

 File fileTo = new File(myFilename.toString() + "/myPic.png");  
 // use fileTo object to save your file in your new directory that was created in the onCreate method
 }
}
Espeluznante
fuente