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);
    }