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
7
предоставить пример
Лутая Хузайфа Идрис
2
Пожалуйста, разъясните ответ.
Игорь Ганапольский 03
1
это неправильный ответ - см. ответ ниже
bharal
81

Решение:

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

Метод openFileInput не принимает разделители путей.

Не забывай

fis.close();

в конце.

руникс
источник
Учитывая, что можно использовать FileInputStreamтак, зачем выбирать openFileInput?
Эл Лелопат
1
Это должен быть правильно обозначенный ответ, потому что он дает наглядный пример.
marienke
Простые решения - лучшие. Благодарю.
Danger
30

openFileInput()не принимает пути, только имя файла, если вы хотите получить доступ к пути, используйте File file = new File(path)и соответствующийFileInputStream

рефлог
источник
40
Было бы здорово, если бы вы предоставили пример кода для этого!
Мухаммад Бабар
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);
пользователь1389698
источник
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);
Мухаммад сюкур
источник
Тот же ответ, что и предыдущий.
Anis LOUNIS
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
 }
}
Призрачный
источник