Как сделать копию файла в android?

В моем приложении я хочу сохранить копию определенного файла с другим именем (которое я получаю от пользователя)

Мне действительно нужно открыть содержимое файла и записать его в другой файл?

Каков наилучший способ сделать это?

Solutions Collecting From Web of "Как сделать копию файла в android?"

Чтобы скопировать файл и сохранить его на пути назначения, вы можете использовать приведенный ниже метод.

public void copy(File src, File dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { out.close(); } } finally { in.close(); } } 

Кроме того, вы можете использовать FileChannel для копирования файла. Это может быть быстрее, чем метод копирования байтов при копировании большого файла. Вы не можете использовать его, если ваш файл больше 2 ГБ.

 public void copy(File src, File dst) throws IOException { FileInputStream inStream = new FileInputStream(src); FileOutputStream outStream = new FileOutputStream(dst); FileChannel inChannel = inStream.getChannel(); FileChannel outChannel = outStream.getChannel(); inChannel.transferTo(0, inChannel.size(), outChannel); inStream.close(); outStream.close(); } 

Они работали хорошо для меня

 public static void copyFileOrDirectory(String srcDir, String dstDir) { try { File src = new File(srcDir); File dst = new File(dstDir, src.getName()); if (src.isDirectory()) { String files[] = src.list(); int filesLength = files.length; for (int i = 0; i < filesLength; i++) { String src1 = (new File(src, files[i]).getPath()); String dst1 = dst.getPath(); copyFileOrDirectory(src1, dst1); } } else { copyFile(src, dst); } } catch (Exception e) { e.printStackTrace(); } } public static void copyFile(File sourceFile, File destFile) throws IOException { if (!destFile.getParentFile().exists()) destFile.getParentFile().mkdirs(); if (!destFile.exists()) { destFile.createNewFile(); } FileChannel source = null; FileChannel destination = null; try { source = new FileInputStream(sourceFile).getChannel(); destination = new FileOutputStream(destFile).getChannel(); destination.transferFrom(source, 0, source.size()); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); } } } 

Может быть, слишком поздно для ответа, но самый удобный способ – использовать

FileUtils

static void copyFile(File srcFile, File destFile)

Например, это то, что я сделал

`

 private String copy(String original, int copyNumber){ String copy_path = path + "_copy" + copyNumber; try { FileUtils.copyFile(new File(path), new File(copy_path)); return copy_path; } catch (IOException e) { e.printStackTrace(); } return null; } 

`

Вот решение, которое фактически закрывает входные / выходные потоки, если при копировании возникает ошибка. Это решение использует методы apache Commons IO IOUtils для копирования и обработки закрытия потоков.

  public void copyFile(File src, File dst) { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); out = new FileOutputStream(dst); IOUtils.copy(in, out); } catch (IOException ioe) { Log.e(LOGTAG, "IOException occurred.", ioe); } finally { IOUtils.closeQuietly(out); IOUtils.closeQuietly(in); } } 

Если у вас есть права на root, вы можете скопировать, используя приведенный ниже код:

 void copyFile_dd(){ try { Process su; su = Runtime.getRuntime().exec("su"); String cmd = "dd if=/mnt/sdcard/test.dat of=/mnt/sdcard/test1.dat \n"+ "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0)) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); //throw new SecurityException(); } } 

ИЛИ

 void copyFile_cat(){ try { Process su; su = Runtime.getRuntime().exec("su"); String cmd = "cat /mnt/sdcard/test.dat > /mnt/sdcard/test2.dat \n"+ "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0)) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); //throw new SecurityException(); } }