【问题标题】:InputStream from Assets folder on Android returning emptyAndroid上Assets文件夹中的InputStream返回空
【发布时间】:2013-01-09 01:08:33
【问题描述】:

我没有遇到任何异常,但是当我运行时...

InputStream deckFile = context.getAssets().open("cards.txt");

然后,deckFile.read() 返回 -1。该文件位于正确的文件夹中,并且不为空。

这应该是世界上最简单的事情了……

编辑:AssetManager 确实列出了“cards.txt”,所以这不应该是问题。

【问题讨论】:

    标签: java android io inputstream assets


    【解决方案1】:

    尝试下面的代码行

    InputStream is = getAssets().open("test.txt");
    int size = is.available();
    byte[] buffer = new byte[size]; //declare the size of the byte array with size of the file
    is.read(buffer); //read file
    is.close(); //close file
    
    // Store text file data in the string variable
        String str_data = new String(buffer);
    

    available 方法返回资产的总大小...

    【讨论】:

    • 这是文件的大小,以字节为单位
    • 谢谢,但这并不能解决我的问题。问题是 InputStream 似乎认为那里什么都没有。
    • 缓冲区大小可能会导致某些设备上的OOM。
    【解决方案2】:

    将您的文本文件放在 Android 项目下的 /assets 目录中。使用AssetManager 类访问它。

    AssetManager am = context.getAssets();
    InputStream is = am.open("test.txt");
    

    或者您也可以将文件放在/res/raw 目录中,该文件将被索引并可以通过 R 文件中的 id 访问:

    InputStream is = getResources().openRawResource(R.raw.test);
    

    已编辑:

    试试下面的方法来读取你的文件:

     public String convertStreamToString(InputStream p_is) throws IOException {
        /*
         * To convert the InputStream to String we use the
         * BufferedReader.readLine() method. We iterate until the BufferedReader
         * return null which means there's no more data to read. Each line will
         * appended to a StringBuilder and returned as String.
         */
        if (p_is != null) {
            StringBuilder m_sb = new StringBuilder();
            String m_line;
            try {
                BufferedReader m_reader = new BufferedReader(
                        new InputStreamReader(p_is));
                while ((m_line = m_reader.readLine()) != null) {
                    m_sb.append(m_line).append("\n");
                }
            } finally {
                p_is.close();
            }
            Log.e("TAG", m_sb.toString());
            return m_sb.toString();
        } else {
            return "";
        }
    }
    

    我相信它会帮助你。

    【讨论】:

    • 它看起来应该是一个int,所以我尝试了 InputStream deckFile = context.getResources().openRawResource(R.raw.cards);这也没有用。
    • 您将文件保存在res/raw 文件夹的assets 文件夹中的什么位置?
    • 请查看我已编辑的答案并尝试以这种方式访问​​它。
    • 我在 /assets 和 /res/raw 中有一个名为“cards.txt”的文件。当我调用它时它不会抛出异常,并且 AssetManager 的“list”函数在那里列出“cards.txt”,但由于某种原因,它会将文件作为空文件而不是长文本文件读取......
    • 好吧,我现在用你的方法得到一个 IOException,这是……什么。我会想办法的。谢谢。
    【解决方案3】:

    问题是我的文件太大,并且因为它的“.txt”扩展名而被压缩。通过将文件重命名为通常压缩的格式“.mp3”,没有问题

    【讨论】:

    • 哈哈,我也遇到了同样的问题,不过我把文件扩展名改成了jpg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2016-12-29
    • 2021-08-28
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多