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

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

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

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

Ответ 1

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

public static 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();
    }
}

В API 19+ вы можете использовать автоматическое управление ресурсами Java:

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

Ответ 2

В качестве альтернативы вы можете использовать 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();
}

Ответ 3

Расширение Котлина для него

fun File.copyTo(file: File) {
    inputStream().use { input ->
        file.outputStream().use { output ->
            input.copyTo(output)
        }
    }
}

Ответ 4

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

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

Ответ 5

Это просто на Android O (API 26), как вы видите:

  @RequiresApi(api = Build.VERSION_CODES.O)
  public static void copy(File origin, File dest) throws IOException {
    Files.copy(origin.toPath(), dest.toPath());
  }

Ответ 6

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

FileUtils 's

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;
    }

`

Ответ 7

Вот решение, которое фактически закрывает потоки ввода/вывода, если при копировании возникает ошибка. Это решение использует методы 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);
        }
    }

Ответ 9

                    FileInputStream fis=null;
                    FileOutputStream fos=null;
                    try {
                        fis = new FileInputStream(from);
                        fos=new FileOutputStream(to);
                        byte[] by=new byte[fis.available()];
                        int len;
                        while((len=fis.read(by))>0){
                            fos.write(by,0,len);
                        }
                    }catch (Throwable t){
                        Toast.makeText(context,t.toString(),Toast.LENGTH_LONG).show();
                    }
                    finally {
                        if(fis!=null) {
                            try {
                                fis.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(context,e.toString(),Toast.LENGTH_LONG).show();
                            }
                        }
                        if(fos!=null) {
                            try {
                                fos.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(context,e.toString(),Toast.LENGTH_LONG).show();
                            }
                        }
                    }

Ответ 10

Если у вас есть права на 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();
    }
}