java.lang.IllegalArgumentException: zawiera separator ścieżki

79

Mam w kodzie nazwę pliku:

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

W drugiej linii pojawia się błąd:

05-11 16: 49: 06.355: ERROR / AndroidRuntime (4570): Spowodowane przez: java.lang.IllegalArgumentException: Plik //sdcard//imageq.png zawiera separator ścieżki

Próbowałem również tego formatu:

String NAME_OF_FILE="/sdcard/imageq.png";
MAMurali
źródło

Odpowiedzi:

58

Ta metoda otwiera plik w prywatnym obszarze danych aplikacji. Nie możesz otwierać żadnych plików w podkatalogach w tym obszarze ani z zupełnie innych obszarów za pomocą tej metody. Więc użyj konstruktora FileInputStreambezpośrednio, aby przekazać ścieżkę z katalogiem w niej.

Stephan
źródło
46
Proszę podać przykład tego
Anand Savjani
11
Twoja odpowiedź jest myląca; OP używa FileInputStream
FracturedRetina
7
podaj przykład
Lutaaya Huzaifah Idris
2
Proszę wyjaśnij odpowiedź.
Igor Ganapolsky
1
to jest zła odpowiedź - proszę zobaczyć odpowiedź poniżej
bharal
81

Rozwiązaniem jest:

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

Metoda openFileInput nie akceptuje separatorów ścieżek.

Nie zapomnij

fis.close();

na końcu.

runix
źródło
Biorąc pod uwagę, że można używać w FileInputStreamten sposób, po co wybierać openFileInput?
Al Lelopath
1
Powinna to być poprawnie zaznaczona odpowiedź, ponieważ daje jasny przykład.
marienke,
Proste rozwiązania są najlepsze. Dzięki.
Danger
30

openFileInput()nie akceptuje ścieżek, tylko nazwę pliku, jeśli chcesz uzyskać dostęp do ścieżki, użyj File file = new File(path)i odpowiadającegoFileInputStream

reflog
źródło
40
Byłoby wspaniale, gdybyś dostarczył przykładowy kod, aby to osiągnąć!
Muhammad Babar
2
@MuhammadBabar oczywiście potrzebujesz kodu, nie zawsze możesz kodować bez kogoś, kto go dostarczy. Może sprawdź dokumenty?
Neon Warge,
3

Otrzymałem powyższy komunikat o błędzie podczas próby uzyskania dostępu do pliku z pamięci wewnętrznej przy użyciu openFileInput("/Dir/data.txt")metody z podkatalogiem Dir.

Nie możesz uzyskać dostępu do podkatalogów za pomocą powyższej metody.

Spróbuj czegoś takiego:

FileInputStream fIS = new FileInputStream (new File("/Dir/data.txt"));
Swaran Gõdlã
źródło
2

Nie możesz bezpośrednio użyć ścieżki z separatorami katalogów, ale będziesz musiał utworzyć obiekt plikowy dla każdego katalogu.

UWAGA: Ten kod tworzy katalogi, twój może tego nie potrzebować ...

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
źródło
5
Co ? File f = new File(fileDirPath); f.mkdirs();Proszę edytować
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
źródło
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
źródło
Taka sama odpowiedź jak poprzednia.
Anis LOUNIS
0

Rozwiązałem ten typ błędu, tworząc katalog w zdarzeniu onCreate, a następnie uzyskując dostęp do katalogu, tworząc nowy obiekt pliku w metodzie, która musi wykonać coś takiego, jak zapisanie lub pobranie pliku w tym katalogu, mam nadzieję, że to pomoże!

 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
 }
}
Upiorny
źródło