Я продолжаю получать ошибку 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)
Вот моя структура проекта:
В системе Linux, такой как Android, путь "/assets/test.json" означает, что файл находится в папке ресурсов корневого каталога файловой системы, а не в каталоге данных приложения. Для правильной загрузки ресурсов см. Этот пример: stackoverflow.com/questions/9544737/read-file-from-assets
Возможный дубликат читать файл из активов
@Robert Будет ли то, что вы отправили, по-прежнему работать для JSONReader с помощью FileReader?
@Adam просто не используйте FileReader, просто используйте читалку, как показано в ответе Дэниела.




вместо new FileReader("/assets/test.json"),
использовать
new BufferedReader(new InputStreamReader(getAssets().open("test.json"), StandardCharsets.UTF_8));
Вам необходимо использовать метод getAssets() для использования ресурсов в android.
Только одно небольшое улучшение вашего ответа: используйте StandardCharsets.UTF_8 вместо "UTF-8". Это сэкономит вам один ненужный блок перехвата.
Просто используйте приведенный ниже фрагмент, указав имя файла
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 возвращают общее количество байтов в потоке, многие - нет. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.
ваш путь к папке с активами неверен