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

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.


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.


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


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

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

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

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

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
 }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.