Подтвердить что ты не робот

Файл Read Assets как строка

Я хотел бы прочитать содержимое файла, расположенного в Assets as String. Например, текстовый документ, расположенный в src/main/assets/

Оригинальный вопрос
Я обнаружил, что этот вопрос в основном используется как "FAQ" для чтения файла активов, поэтому я обобщил вопрос выше. Ниже мой первоначальный наивный вопрос

Я пытаюсь прочитать файл активов как строку, я пробовал как 20 ответов здесь, но они не работают для меня.

У меня есть файл в папке моих ресурсов: data.opml, и я должен поместить содержимое в строку. Я отправляю его так:

 OPML.importFromFile(string, MainTabActivity.this);

И получите его как:

 importFromFile(String filename, Context context); 

Что-то, что работало (но это не файл активов):

 OPML.importFromFile(new StringBuilder(Environment.getExternalStorageDirectory().toString()).append(File.separator).append(fileNames[which]).toString(),MainTabActivity.this);

Я пробовал:

 AssetFileDescriptor descriptor = getAssets().openFd("data.opml");
 FileReader reader = new FileReader(descriptor.getFileDescriptor());
 And also:
 InputStream input = getAssets().open("data.opml");
 Reader reader = new InputStreamReader(input, "UTF-8");

Maby Я делаю что-то не так, но это просто не сработает, потому что проект дает ошибки (соответственно: OPML не способен для аргументов filleader и reader). Если кто-то знает, как это сделать, это будет очень благодарен!

4b9b3361

Ответ 1

getAssets().open() вернет InputStream. Прочтите это с помощью стандартного ввода-вывода Java:

Джава:

StringBuilder sb = new StringBuilder();
InputStream is = getAssets().open("book/contents.json");
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8 ));
String str;
while ((str = br.readLine()) != null) {
    sb.append(str);
}
br.close();

Котлин:

val str = assets.open("book/contents.json").bufferedReader().use { it.readText() }

Ответ 2

Есть небольшая ошибка. Код CommonsWare - символы новой строки отбрасываются и не добавляются в строку. Вот какой-то фиксированный код, готовый для копирования + вставка:

private String loadAssetTextAsString(Context context, String name) {
        BufferedReader in = null;
        try {
            StringBuilder buf = new StringBuilder();
            InputStream is = context.getAssets().open(name);
            in = new BufferedReader(new InputStreamReader(is));

            String str;
            boolean isFirst = true;
            while ( (str = in.readLine()) != null ) {
                if (isFirst)
                    isFirst = false;
                else
                    buf.append('\n');
                buf.append(str);
            }
            return buf.toString();
        } catch (IOException e) {
            Log.e(TAG, "Error opening asset " + name);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    Log.e(TAG, "Error closing asset " + name);
                }
            }
        }

        return null;
    }

Ответ 3

Вы также можете сделать это, не используя циклы. Это довольно просто

AssetManager assetManager = getAssets();
InputStream input;
String text = "";

    try {
        input = assetManager.open("test.txt");

        int size = input.available();
        byte[] buffer = new byte[size];
        input.read(buffer);
        input.close();

        // byte buffer into a string
        text = new String(buffer);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Log.v("TAG", "Text File: " + text);

Ответ 4

привет это на мой взгляд самый чистый подход:

  public static String loadTextFromAssets(Context context, String assetsPath, Charset charset) throws IOException { InputStream is = context.getResources().getAssets().open(assetsPath); byte[] buffer = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); for (int length = is.read(buffer); length != -1; length = is.read(buffer)) { baos.write(buffer, 0, length); } is.close(); baos.close(); return charset == null? new String(baos.toByteArray()): new String(baos.toByteArray(), charset); }

потому что у читателей могут возникнуть проблемы с переносами строк.