2012-06-07 27 views

回答

5

这里是我做过什么:

复制你的资产文件到SD卡:

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

你去那里。你有你的资产文件的文件对象的副本。希望这可以帮助。

+0

如果我喜欢这个,我会在应用程序中感受到内存不足。 – Pavandroid

+0

这是为我工作。我省略了一些部分。在此代码之前,请使用文件对象的mkdirs()方法创建文件夹。你可以谷歌它。 – drulabs

+0

您正在为@ vipul's和我的解决方案解决内存异常......您可以粘贴logcat条目。有些事情是不对的。你在设备或模拟器上测试? – drulabs

0

我不知道有什么方法可以得到一个实际File对象,但如果你能有一个FileDescriptor工作,你可以这样做:

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

我不知道这可以用什么方式。你能解释一下这个描述符的用法吗? – Pavandroid

4

读取原始文件到文件。

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

为了避免内存不足应用以下逻辑。

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

+0

如果我喜欢这样,我会在应用程序中感受到内存不足。 – Pavandroid

+0

查看更新的答案 –

+0

感谢您的解决方案。为你+1。干杯。 –