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

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

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

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

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

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

Solutions Collecting From Web of "Открытый файл Android"

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

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

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

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

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

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

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

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

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

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

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