java.lang.IllegalArgumentException: містить роздільник шляху


79

У моєму коді є ім'я файлу як:

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

У другому рядку з’являється повідомлення про помилку:

05-11 16: 49: 06.355: ПОМИЛКА / AndroidRuntime (4570): Викликано: java.lang.IllegalArgumentException: Файл //sdcard//imageq.png містить роздільник шляху

Я також спробував цей формат:

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

Відповіді:


58

Цей метод відкриває файл у області приватних даних програми. За допомогою цього методу ви не можете відкрити будь-які файли в підкаталогах у цій області або з зовсім інших областей. Тому використовуйте конструктор FileInputStreamбезпосередньо, щоб передати шлях із каталогом у ньому.


46
Будь ласка, наведіть для цього приклад
Ананд Савджані,

11
Ваша відповідь бентежить; OP використовує FileInputStream
FracturedRetina


2
Будь ласка, поясніть відповідь.
ІгорГанапольський

1
це неправильна відповідь - див. відповідь нижче
bharal

81

Рішення:

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

Метод openFileInput не приймає роздільники шляхів.

Не забувайте це робити

fis.close();

в кінці.


З огляду на те, що можна користуватися FileInputStreamподібним чином, чому вибрати використовувати openFileInput?
Al Lelopath

1
Це має бути правильно позначена відповідь, оскільки вона дає наочний приклад.
marienke

Найпростіші рішення - найкращі. Дякую.
Небезпека

30

openFileInput()не приймає шляхи, лише ім'я файлу, якщо ви хочете отримати доступ до шляху, використання File file = new File(path)та відповідногоFileInputStream


39
Було б чудово, якби ви надали якийсь зразок коду для досягнення цього!
Мухаммед Бабар

2
@MuhammadBabar, звичайно, вам потрібен код, ви не завжди можете кодувати, якщо хтось не надав вам його. Перевірте документи, можливо?
Neon Warge

3

Я отримав вищезазначене повідомлення про помилку під час спроби отримати доступ до файлу з внутрішньої пам’яті за допомогою openFileInput("/Dir/data.txt")методу з підкаталогом Dir.

Ви не можете отримати доступ до підкаталогів, використовуючи вищевказаний метод.

Спробуйте щось на зразок:

FileInputStream fIS = new FileInputStream (new File("/Dir/data.txt"));

2

Ви не можете використовувати шлях із роздільниками каталогів безпосередньо, але вам доведеться створити об’єкт файлу для кожного каталогу.

ПРИМІТКА. Цей код робить каталоги, можливо, вам це не знадобиться ...

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
Що ? File f = new File(fileDirPath); f.mkdirs();Будь ласка, відредагуйте
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);

Та сама відповідь, що і попередня.
Аніс ЛУНІС

0

Я вирішив цей тип помилок, зробивши каталог у події onCreate, а потім отримавши доступ до каталогу, створивши новий файл-об'єкт у методі, який повинен зробити щось на зразок збереження або отримання файлу в цьому каталозі, сподіваюся, це допоможе!

 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
 }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.