2012-06-07 1 views
9

У меня есть файл jar, для которого мне нужно передать файл-объект. Как передать ресурс или активы этому методу в качестве файла?Чтение активов или файлов raw или ресурсов в качестве объекта File в Android

Как преобразовать активы или необработанные файлы в папки проекта в файловые объекты?

ответ

5

Вот что я сделал:

Скопируйте файл активов в 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"); 

Там вы идете. У вас есть копия файлового объекта вашего файла активов. Надеюсь это поможет.

+0

Я получаю Out of Memory в своем приложении, если мне это нравится. – Pavandroid

+0

Это работает для меня. Я пропустил какую-то часть. Создайте папку, используя метод mkdirs() объекта файла перед этим кодом. Вы можете это сделать. – drulabs

+0

Вы получаете исключение из памяти для @ vipul и моих решений ... можете ли вы вставлять записи 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(); 

Чтобы избежать OutOfMemory применить следуя логике.

Не создавайте огромный ByteBuffer, содержащий ВСЕ данные сразу. Создайте гораздо меньший ByteBuffer, заполните его данными, а затем напишите эти данные в FileChannel. Затем сбросьте ByteBuffer и продолжайте пока все данные не будут записаны.

+0

Я получаю Out of Memory в своем приложении, если мне это нравится. – Pavandroid

+0

см. Обновленный ответ –

+0

Спасибо за решение. +1 для вас. Приветствия. –

Смежные вопросы