FileNotFoundException в методе onCreate ()

Я продолжаю получать ошибку FileNotFoundException при попытке загрузить мой файл в JSONReader, используя InputStream в моем методе onCreate.

Я протестировал этот код в простой программе Java, и, похоже, он работает нормально, а также читает файл JSON. Однако в Android Studio я продолжаю получать FileNotFoundException.

Я неправильно указываю расположение файла?

Это мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    List<String> linksList = new ArrayList<>();

    try {
        JsonReader reader = null;
        reader = new JsonReader(new FileReader("/assets/test.json"));
        reader.beginArray();

        while (reader.hasNext()) {

            String value = reader.nextString();
            linksList.add(value);
        }

        reader.endArray();
        reader.close();
    } catch (FileNotFoundException fnfe) {

        fnfe.printStackTrace();

    } catch (IOException ioe) {

        ioe.printStackTrace();
    }
}

Вот Бревно -

12-27 11:56:11.342 20703-20703/com.adam.jsonreader W/System.err: java.io.FileNotFoundException: /assets/test.json (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:99)
12-27 11:56:11.343 20703-20703/com.adam.jsonreader W/System.err:     at java.io.FileReader.<init>(FileReader.java:58)
        at com.adamkhora.jsonreader.HomeActivity.onCreate(HomeActivity.java:43)

Вот моя структура проекта:

FileNotFoundException в методе onCreate ()

ваш путь к папке с активами неверен

Vivek Mishra 27.12.2018 13:27

В системе Linux, такой как Android, путь "/assets/test.json" означает, что файл находится в папке ресурсов корневого каталога файловой системы, а не в каталоге данных приложения. Для правильной загрузки ресурсов см. Этот пример: stackoverflow.com/questions/9544737/read-file-from-assets

Robert 27.12.2018 13:27

Возможный дубликат читать файл из активов

lelloman 27.12.2018 13:29

@Robert Будет ли то, что вы отправили, по-прежнему работать для JSONReader с помощью FileReader?

Adam 27.12.2018 13:31

@Adam просто не используйте FileReader, просто используйте читалку, как показано в ответе Дэниела.

Robert 27.12.2018 14:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вместо new FileReader("/assets/test.json"),

использовать

new BufferedReader(new InputStreamReader(getAssets().open("test.json"), StandardCharsets.UTF_8)); 

Вам необходимо использовать метод getAssets() для использования ресурсов в android.

Только одно небольшое улучшение вашего ответа: используйте StandardCharsets.UTF_8 вместо "UTF-8". Это сэкономит вам один ненужный блок перехвата.

Robert 27.12.2018 14:03

Просто используйте приведенный ниже фрагмент, указав имя файла

 try {
        InputStream is = context.getAssets().open("test.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");

    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }

Не используйте этот фрагмент. Из документа Java InputStream: Обратите внимание, что хотя некоторые реализации InputStream возвращают общее количество байтов в потоке, многие - нет. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.

Daniel B. 27.12.2018 13:44

Другие вопросы по теме