Android 将资产文件读取为字符串
我希望以字符串形式读取资产中的文件内容。例如,位于Android 将资产文件读取为字符串,android,string,Android,String,我希望以字符串形式读取资产中的文件内容。例如,位于src/main/assets/ 原始问题 我发现这个问题主要用作阅读资产文件的“常见问题”,因此我总结了上面的问题。以下是我原来的问题 我正在尝试将资产文件读取为字符串。我的资产文件夹中有一个文件:data.opml,希望将其作为字符串读取 我试过一些东西: AssetFileDescriptor descriptor = getAssets().openFd("data.opml"); FileReader reader = new Fi
src/main/assets/
原始问题我发现这个问题主要用作阅读资产文件的“常见问题”,因此我总结了上面的问题。以下是我原来的问题 我正在尝试将资产文件读取为字符串。我的资产文件夹中有一个文件:data.opml,希望将其作为字符串读取 我试过一些东西:
AssetFileDescriptor descriptor = getAssets().openFd("data.opml");
FileReader reader = new FileReader(descriptor.getFileDescriptor());
而且:
InputStream input = getAssets().open("data.opml");
Reader reader = new InputStreamReader(input, "UTF-8");
但是如果没有成功,请举一个完整的示例。getAssets().open()
将返回一个InputStream
。使用标准Java I/O阅读以下内容:Java: Kotlin:
Commonware的代码有一个小错误——换行符被丢弃,而不是添加到字符串中。下面是一些准备复制粘贴的固定代码:
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;
}
您也可以这样做,而无需使用循环。 这很简单
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);
嗨,我认为这是最干净的方法:
因为读者可能会因为换行而遇到麻烦。非常感谢!但是(可能又是我)我无法让它与OPML.importFromFile(xxx,MainTabActivity.this)一起工作;xxx替换为buf或in(不能用于参数stringbuilder(和in bufferedreader))@Mark029348:“无法使其工作”是一个无用的语句,正如您问题中的“不工作”一样。除非你完全准确地解释你的意思,否则任何人都很难进一步帮助你。@Mark029348:我不知道这个
OPML
类是从哪里来的。方法名称表明它需要文件系统上的一个文件,在这种情况下,您不能将资产与它一起使用(除非将资产复制到一个文件,然后将文件路径传递到OPML
)。如果有某种方法采用OPML文本的实际字符串
,请使用该方法。在我展示的代码片段中,String
是通过调用StringBuilder
@Mark029348上的toString()
获得的:将受保护的静态void importfromputstream()
方法更改为public
,然后将其与从getAssets().open()
获得的输入流一起使用importFromFile()
需要文件名,不能直接与资产一起使用。@Mark029348:我猜您在OPML
类中修改了importFromFile()
。我没叫你这么做。回滚到原始文件。将文本编辑光标立即放在protected static void importFromInputStream()
方法的protected
中的d
的右侧。按BACKSPACE键8次。键入public
。这将把关键字protected
更改为public
。保存您的文件。在您试图使用importFromInputStream()
的代码中使用新的公共importFromInputStream()
方法。请不要使用finally块释放资源。根据规范,终结器是不可靠的。读tl;dr-为什么不,何时适用,使用什么替代?不要依赖finalize块关闭BufferedReader。在try块中关闭它。考虑最终只是作为一个安全网。我认为你最终混淆和最终确定。最后是try-catch块的结束,是关闭资源的最佳位置。Finalize是对象引用的一部分,当对象是GCd时,可能会调用它,也可能不会调用它,而且它根本不是关闭资源的正确位置。我认为这样使用available()方法是不安全的。请参阅。在实践中,available()可以很好地处理小文件,这些文件可以容纳如此多的I/O缓冲区。在实践中,它可能在某些情况下工作,但我不愿意成为开发人员,必须找到并修复仅在文件稍微过大时才会发生的错误。这是旧的,但我仍然反对投票。“available()返回可从此输入流读取(或跳过)的字节数的估计值,而无需在下次调用此输入流的方法时进行阻止。”请认真不要以这种方式使用available()。
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;
}
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);
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);
}