java.lang.IllegalArgumentException: enthält ein Pfadtrennzeichen

79

Ich habe einen Dateinamen in meinem Code als:

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

Ich erhalte eine Fehlermeldung in der 2. Zeile:

05-11 16: 49: 06.355: ERROR / AndroidRuntime (4570): Auslöser: java.lang.IllegalArgumentException: Die Datei //sdcard//imageq.png enthält ein Pfadtrennzeichen

Ich habe dieses Format auch ausprobiert:

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

Antworten:

58

Diese Methode öffnet eine Datei im privaten Datenbereich der Anwendung. Mit dieser Methode können Sie keine Dateien in Unterverzeichnissen in diesem Bereich oder aus ganz anderen Bereichen öffnen. Verwenden Sie also den Konstruktor von FileInputStreamdirekt, um den Pfad mit einem Verzeichnis darin zu übergeben.

Stephan
quelle
44
Bitte geben Sie ein Beispiel dafür
Anand Savjani
11
Ihre Antwort ist verwirrend; OP verwendet einen FileInputStream
FracturedRetina
7
Beispiel geben
Lutaaya Huzaifah Idris
2
Bitte erläutern Sie die Antwort.
IgorGanapolsky
1
Dies ist die falsche Antwort - siehe die Antwort unten
Bharal
81

Die Lösung ist:

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

Die openFileInput-Methode akzeptiert keine Pfadtrennzeichen.

Vergiss es nicht

fis.close();

Am Ende.

Runix
quelle
Angesichts der Tatsache, dass man so verwenden kann FileInputStream, warum sollte man sich für die Verwendung entscheiden openFileInput?
Al Lelopath
1
Dies sollte die richtig markierte Antwort sein, da sie ein klares Beispiel liefert.
Marienke
Einfache Lösungen sind die besten. Vielen Dank.
Gefahr
30

openFileInput()akzeptiert keine Pfade, nur einen Dateinamen, wenn Sie auf einen Pfad zugreifen möchten, verwenden File file = new File(path)und korrespondierenFileInputStream

reflog
quelle
39
Wäre toll, wenn Sie einen Beispielcode angegeben hätten, um dies zu erreichen!
Muhammad Babar
2
@ MuhammadBabar natürlich brauchst du Code, du kannst nicht immer codieren, ohne dass dir jemand einen zur Verfügung stellt. Überprüfen Sie die Dokumente vielleicht?
Neon Warge
3

Ich habe die obige Fehlermeldung erhalten, als ich versucht habe, mit einer openFileInput("/Dir/data.txt")Methode mit Unterverzeichnis aus dem internen Speicher auf eine Datei zuzugreifen Dir.

Mit der oben beschriebenen Methode können Sie nicht auf Unterverzeichnisse zugreifen.

Versuchen Sie etwas wie:

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

Sie können den Pfad nicht direkt mit Verzeichnistrennzeichen verwenden, müssen jedoch für jedes Verzeichnis ein Dateiobjekt erstellen.

HINWEIS: Dieser Code erstellt Verzeichnisse, die Sie möglicherweise nicht benötigen ...

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);
user1389698
quelle
5
Was? File f = new File(fileDirPath); f.mkdirs();Bitte bearbeiten
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
quelle
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
quelle
Gleiche Antwort wie die vorherige.
Anis
0

Ich habe diese Art von Fehler behoben, indem ich im onCreate-Ereignis ein Verzeichnis erstellt und dann auf das Verzeichnis zugegriffen habe, indem ich ein neues Dateiobjekt in einer Methode erstellt habe, die beispielsweise eine Datei in diesem Verzeichnis speichern oder abrufen muss. Ich hoffe, dies hilft!

 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
 }
}
Wraithious
quelle