【问题标题】:Reading assets or raw or resource files as a File object in Android在 Android 中将资产或原始文件或资源文件作为 File 对象读取
【发布时间】:2012-06-11 10:37:39
【问题描述】:

我有一个需要传递文件对象的 jar 文件。如何将资源或资产作为文件对象传递给该方法?

如何将项目文件夹中的资产或原始文件转换为文件对象?

【问题讨论】:

    标签: android file-handling android-resources


    【解决方案1】:

    这是我所做的:

    将您的资产文件复制到 SDCard:

    AssetManager assetManager = context.getResources().getAssets();
    
    String[] files = null;
    
    try {
        files = assetManager.list("ringtone"); //ringtone is folder name
    } catch (Exception e) {
        Log.e(LOG_TAG, "ERROR: " + e.toString());
    }
    
    for (int i = 0; i < files.length; i++) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open("ringtone/" + files[i]);
            out = new FileOutputStream(basepath + "/ringtone/" + files[i]);
    
            byte[] buffer = new byte[65536 * 2];
            int read;
            while ((read = in.read(buffer)) != -1) {
                out.write(buffer, 0, read);
            }
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
            Log.d(LOG_TAG, "Ringtone File Copied in SD Card");
        } catch (Exception e) {
            Log.e(LOG_TAG, "ERROR: " + e.toString());
        }
    }
    

    然后通过路径读取你的文件:

    File ringFile = new File(Environment.getExternalStorageDirectory().toString() + "/ringtone", "fileName.mp3");
    

    给你。您拥有资产文件的文件对象的副本。希望这会有所帮助。

    【讨论】:

    • 如果我这样做的话,我的应用程序会出现内存不足。
    • 这对我有用。我省略了一部分。请在此代码之前使用文件对象的 mkdirs() 方法创建文件夹。你可以谷歌一下。
    • @vipul 和我的解决方案的内存不足异常...您可以粘贴 logcat 条目吗?有什么不对劲。你在设备或模拟器上测试?
    【解决方案2】:

    将原始文件读入文件。

        InputStream ins = getResources().openRawResource(R.raw.my_db_file);
        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        int size = 0;
        // Read the entire resource into a local byte buffer.
        byte[] buffer = new byte[1024];
        while((size=ins.read(buffer,0,1024))>=0){
          outputStream.write(buffer,0,size);
        }
        ins.close();
        buffer=outputStream.toByteArray();
    
        FileOutputStream fos = new FileOutputStream("mycopy.db");
        fos.write(buffer);
        fos.close();
    

    为避免 OutOfMemory 应用以下逻辑。

    不要一次创建一个包含所有数据的巨大 ByteBuffer。创建一个小得多的 ByteBuffer,用数据填充它,然后将这些数据写入 FileChannel。然后重置 ByteBuffer 并继续,直到所有数据都被写入。

    【讨论】:

    • 如果我这样做的话,我的应用程序会出现内存不足。
    • 感谢您的解决方案。为你+1。干杯。
    【解决方案3】:

    我不知道有什么方法可以获取实际的 File 对象,但如果您可以使用 FileDescriptor,您可以这样做:

    FileDescriptor fd = getAssets().openFd(assetFileName).getFileDescriptor();
    

    【讨论】:

    • 不知道这个可以用什么方式。你能解释一下这个描述符的用法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2014-02-21
    相关资源
    最近更新 更多