@alli3223

Android studio при попытке открыть файл для парсинга упорно его не видит, какие могут быть причины?

файл test.xml лежит в папке files, которая лежит в папке app
при вызове метода приведенного ниже в лог выводится 1 2 3 после чего возникает ошибка: File not found: /data/user/0/com.example.myapplication/files/test.xml: open failed: ENOENT (No such file or directory)
метод : protected Document buildDoc(Context context, String fileName) throws Exception{
Document doc = null;

try {
File file = new File(context.getFilesDir(), "test.xml");
Log.d("tag", "1");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
Log.d("tag", "2");
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Log.d("tag", "3");

doc = dBuilder.parse(file);
Log.d("tag", "4");

} catch (FileNotFoundException e) {
Log.e("error", "File not found: " + e.getMessage());
throw e;
} catch (Exception e) {
throw e;
}
return doc;
}
я никак не могу понять почему и как исправить ошибку
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
Начиная с 12го проще считать, что файлов в андроиде нет. Есть потоки и контент провайдеры. Огрызки файлового доступа остались в двух местах.

File file = new File(context.getFilesDir(), "test.xml");

и аналогично к директории кеширования.
Раз файл не находит, то очевидно проблема в том как он оказался записан по пути

/data/user/0/com.example.myapplication/files/test.xml

Из строк дальше читается, что вы хотите заселить свою базу данных.
Начальные данные (xml) поместите в assets так как из дистрибутива по используемому пути автоматом ничего не попадет. Сделайте копирование, если напрямую не получиться читать
private void copyPdfFromAssets() {
        executor.execute(() -> {
            try {
                InputStream inp = getAssets().open("IppVirtual.pdf");
                java.io.File file = new java.io.File(getApplication().getCacheDir(), "preview.pdf");
                FileOutputStream fos = new FileOutputStream(file);
                byte[] buf = new byte[32768];
                int len;
                while ((len = inp.read(buf)) != -1) {
                    if (len > 0) {
                        fos.write(buf, 0, len);
                    }
                }
                fos.flush();
                fos.close();
                inp.close();
                handler.post(this::createPreview);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

Вот подобный кусок из моего свежего приложения.

А если смотреть дальше, то заполнение базы данных гуглить как "android prepopulate room database"
кто-то копирует готовый файл, а мне пару записей проще заполнить выполнением захардкоженных запросов
Ответ написан
Комментировать
@Dementor
программист, архитектор, аналитик
Выглядит как отсутствие прав для файла:
/data/user/0/com.example.myapplication/files/test.xml

Для работы DocumentBuilder понадобятся права на чтение и на модификацию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы