Файл 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). Если кто-то знает, как это сделать, это будет очень благодарен!
Ответы
Ответ 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); }
потому что у читателей могут возникнуть проблемы с переносами строк.