2014-11-23 4 views
0

это MyNewMain.javaандроид копирование файлов из активов сд карты

 CopyAssets(); 


    private void CopyAssets() { 
     AssetManager assetManager = getAssets(); 
     String[] files = null; 
     try { 
      files = assetManager.list("Files"); 
     } catch (IOException e) { 
      Log.e("tag", e.getMessage()); 
     } 

     for(String filename : files) { 
      System.out.println("File name => "+filename); 
      InputStream in = null; 
      OutputStream out = null; 
      try { 
       in = assetManager.open("Files/"+filename); 
       out = new FileOutputStream(Environment.getExternalStorageDirectory().toString() +"/" + filename); 
       copyFile(in, out); 
       in.close(); 
       in = null; 
       out.flush(); 
       out.close(); 
       out = null; 
      } catch(Exception e) { 
       Log.e("tag", e.getMessage()); 
      } 
     } 
    } 
    private void copyFile(InputStream in, OutputStream out) throws IOException { 
     byte[] buffer = new byte[1024]; 
     int read; 
     while((read = in.read(buffer)) != -1){ 
      out.write(buffer, 0, read); 
     } 
    } 

в папке моих активов у меня есть папка с названием файлы. есть .txt-файл onCreate methed Я звоню CopyAssets();

Ниже приведены методы, которые я использовал.

проблема в том, что это ничего не делает. У меня нет правды, почему мой файл не копируется. в мой манифест я добавил

и app.iml содержит

+0

Ничего? 'System.out.println (« Имя файла => »+ имя файла);'. Что это печатает? Почему вы публикуете столько кода, который не имеет ничего общего с вашей проблемой? Только CopyAssets() будет делать. Пожалуйста, отредактируйте свой пост. – greenapps

+0

'Environment.getExternalStorageDirectory(). ToString()'. Попробуйте 'Environment.getExternalStorageDirectory(). GetAbsolutePath()'. – greenapps

+0

Я отредактировал мое сообщение. – user2864772

ответ

0

Я знаю, что это был дан ответ, но у меня есть немного более элегантный способ скопировать из каталога активов в файл на SDCard. Он не требует цикла «для», но вместо этого использует файловые потоки и каналы для выполнения этой работы.

(Примечание) При использовании любого типа сжатого файла APK, PDF, ... Вы можете переименовать расширение файла, прежде чем вставлять в актив, а затем переименовать сразу скопировать его в SDcard)

AssetManager am = context.getAssets(); 
AssetFileDescriptor afd = null; 
try { 
    afd = am.openFd("MyFile.dat"); 

    // Create new file to copy into. 
    File file = new File(Environment.getExternalStorageDirectory() + java.io.File.separator + "NewFile.dat"); 
    file.createNewFile(); 

    copyFdToFile(afd.getFileDescriptor(), file); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Способ копирования файла без необходимости его прокрутки.

public static void copyFdToFile(FileDescriptor src, File dst) throws IOException { 
    FileChannel inChannel = new FileInputStream(src).getChannel(); 
    FileChannel outChannel = new FileOutputStream(dst).getChannel(); 
    try { 
     inChannel.transferTo(0, inChannel.size(), outChannel); 
    } finally { 
     if (inChannel != null) 
      inChannel.close(); 
     if (outChannel != null) 
      outChannel.close(); 
    } 
} 

Благодаря JPM's Answer

+1

спасибо, но это все еще не выполняется. – user2864772

-1

на андроид апи 22, вызовите getFileDescriptor() на AssetFileDescriptor объект будет возвращать FileDescriptor всего файла APK. поэтому ответ Сальмаана неверен на android api 22.

Я не вижу исходный код в другом api. Поэтому я не знаю поведения getFileDescriptor() в других api.

Я нахожу ответ под кодом this question.

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