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";

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.


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.


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


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"));

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);

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());
        }

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);

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
 }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.