Чтение из txt файла в assets

Двое суток читала всё по этому поводу на Stack Overflow, но ответы все многолетней давности и указанные там способы через класс AssetManager не работают - android studio вся красная от ошибок. Сейчас так:

try {
            FileInputStream fileInput = openFileInput("txt.txt");
            InputStreamReader reader = new InputStreamReader(fileInput);
            BufferedReader buffer = new BufferedReader(reader);
            StringBuffer strBuffer = new StringBuffer();
            String lines;
            while ((lines = buffer.readLine()) != null) {
                strBuffer.append(lines + "\n");
            }
            txtShow.setText(strBuffer.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

Код работает, но только если txt.txt создан на виртуальном диске эмулятора. В противном случае ошибка:

W/System.err: java.io.FileNotFoundException: /data/user/0/ru.ann.test/files/txt.txt (No such file or directory) W/System.err: at java.io.FileInputStream.open0(Native Method)

Я хочу работать с эмулятором, с файлом в директории app/src/main/assets/ Как этого добиться в реалиях 2020-го года? Спасибо.


Ответы (1 шт):

Автор решения: ЮрийСПб

Вы открываете файл не из того места. Вы пытаетесь его в файловой системе найти, а не в assets.

Вот рабочий код на для получения содержимого файла из assets в виде строки:

fun readFromAssets(context: Context, filename: String): String {
    val reader = BufferedReader(InputStreamReader(context.assets.open(filename), "UTF-8"))

    // do reading, usually loop until end of file reading
    val sb = StringBuilder()
    var line: String? = reader.readLine()
    while (line != null) {
        sb.append(line) // process line
        line = reader.readLine()
    }
    reader.close()
    return sb.toString()
}
→ Ссылка