Подтвердить что ты не робот

Открытый файл Android

Я пытался открыть файл для чтения.

При использовании: Scanner input = new Scanner(filename); файл не найден

но когда я использовал:

InputStream in = openFileInput(filename);
Scanner input = new Scanner(in);

Это сработало. Почему первая строка кода была неправильной?

4b9b3361

Ответ 1

Файлы хранятся на устройстве в определенном зависимом от приложения месте, которое, как я полагаю, добавляет openFileInput в начале имени файла. Конечный результат (местоположение + имя файла) строится следующим образом:

/data/data/<application-package>/files/<file-name>

Обратите внимание, что в документации указано, что параметр openFileInput не может содержать разделители путей.

Чтобы избежать жесткого кодирования пути местоположения, который в принципе даже отличался от устройства к устройству, вы можете получить объект File, указывающий на каталог хранилища, вызывая getFilesDir и использовать его для чтения любого файла вы хотели бы. Например:

File filesDir = getFilesDir();
Scanner input = new Scanner(new File(filesDir, filename));

Обратите внимание, что построение Scanner путем передачи String в качестве параметра приведет к тому, что сканер будет работать с содержимым строки, т.е. интерпретирует его как фактический контент для сканирования, а не как имя файла для открыто.

Ответ 2

Это сбило меня с ума пару минут назад. Я забыл добавить эту строку в манифест:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Я ожидаю, что сообщение об отказе разрешено. Но только что файл не найден...

В вашем случае: openFileInput открывается файл в вашем каталоге данных приватного приложения (/data/data/your.package/filename). Это никогда не сработает. Но сканер пытается открыть его на корневом пути. Поэтому, когда вы хотите прочитать файл с SD-карты, чем использовать Environement.getExternalStorageDirectory().getAbsolutePath() + "/" + filename.

Ответ 3

Scanner sc = new Scanner(new File(filename));