Рубрики
Без рубрики

Как скопировать файл на Java

В этой статье показаны различные способы копирования файла. В Java предпочтительным решением является использование NIO “Files.copy” для копирования файла.

В этой статье показаны четыре способа копирования файла на Java.

  1. Файлы.копировать (NIO)
  2. Общий доступ Apache IO
  3. Гуава
  4. Обычная Ява

В Java 7+ NIO Files.copy является самым простым способом копирования файла, потому что это встроенный API. До Java 7, Apache Commons ввод-вывод До Java 7, Apache Commons ввод-вывод является предпочтительным решением, потому что устаревший ввод-вывод java.io . *

1. *||не имеет API для копирования. (НИО)

1.1 Этот фрагмент кода использует NIO для копирования файла. По умолчанию, если целевой файл существует, копирование завершается ошибкой и вызывает Исключение FileAlreadyExistsException .

  Path fromFile = Paths.get(from);
  Path toFile = Paths.get(to);

  Files.copy(fromFile, toFile);

1.2 Параметр Files.copy принимает аргумент varargs:

  • Стандартный вариант копирования. ЗАМЕНА_СУЩЕСТВУЮЩЕГО – Если целевой файл завершит работу, замените его.
  • Стандартный вариант копирования. АТРИБУТЫ COPY_ATTRIBUTES – Копирует атрибуты файла в целевой файл.
import java.nio.file.StandardCopyOption;

  // if target or destination file exists, replace it.
  Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);

  // multiple StandardCopyOption
  CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,
                StandardCopyOption.COPY_ATTRIBUTES,
                LinkOption.NOFOLLOW_LINKS };

  Files.copy(fromFile, toFile, options);

1.3 Ниже приведен полный пример Java NIO для копирования файла.

package com.mkyong.io.howto;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;


public class CopyFile1 {

    public static void main(String[] args) {

        String fromFile = "/home/mkyong/dev/db.debug.conf";
        String toFile = "/home/mkyong/live/db.conf";

        try {
            copyFileNIO(fromFile, toFile);


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

        System.out.println("Copy file is done.");
    }

    public static void copyFileNIO(String from, String to) throws IOException {

        Path fromFile = Paths.get(from);
        Path toFile = Paths.get(to);

        // if fromFile doesn't exist, Files.copy throws NoSuchFileException
        if (Files.notExists(fromFile)) {
            System.out.println("File doesn't exist? " + fromFile);
            return;
        }

        // if toFile folder doesn't exist, Files.copy throws NoSuchFileException
        // if toFile parent folder doesn't exist, create it.
        Path parent = toFile.getParent();
        if(parent!=null){
            if(Files.notExists(parent)){
                Files.createDirectories(parent);
            }
        }

        // default - if toFile exist, throws FileAlreadyExistsException
        Files.copy(fromFile, toFile);

        // if toFile exist, replace it.
        // Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);

        // multiple StandardCopyOption
        /*CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,
                StandardCopyOption.COPY_ATTRIBUTES,
                LinkOption.NOFOLLOW_LINKS };

        Files.copy(fromFile, toFile, options);*/

    }
}

2. Общий доступ Apache IO

В старые времена (до Java 7) commons-io был самым простым решением для копирования файла на Java.

  
      commons-io
      commons-io
      2.7
  
import org.apache.commons.io.FileUtils;

  public static void copyFileCommonIO(String from, String to)
        throws IOException {

        File fromFile = new File(from);
        File toFile = new File(to);

        FileUtils.copyFile(fromFile, toFile);

  }

3. Гугл Гуава

Многие проекты начинают использовать Гуава и предпочитают файлы Гуавы .копировать , с тем же именем, что и у Java NIO, убедитесь, что вы импортируете правильные пакеты com.google.common.io . Файлы .

  
      com.google.guava
      guava
      29.0-jre
  
  public static void copyFileGuava(String from, String to) throws IOException {

      File fromFile = new File(from);
      File toFile = new File(to);

      // @Beta?
      com.google.common.io.Files.copy(fromFile, toFile);

  }

Файлы Гуавы класс доступен с версии 1.0, понятия не имею, почему в Файлах.копировать все еще есть @Бета аннотация на нем?

package com.google.common.io;

public final class Files {

  //..
  @Beta
  public static void copy(File from, File to) throws IOException {
    checkArgument(!from.equals(to),
      "Source %s and destination %s must be different", from, to);
    asByteSource(from).copyTo(asByteSink(to));
  }

4. Обычная Ява

В этом примере используется простой Ява Входной поток и OutputStream для копирования файла.

  public static void copyFilePlainJava(String from, String to) throws IOException {

      InputStream inStream = null;
      OutputStream outStream = null;

      try {

          File fromFile = new File(from);
          File toFile = new File(to);

          inStream = new FileInputStream(fromFile);
          outStream = new FileOutputStream(toFile);

          byte[] buffer = new byte[1024];

          int length;
          while ((length = inStream.read(buffer)) > 0) {
              outStream.write(buffer, 0, length);
              outStream.flush();
          }

      } finally {
          if (inStream != null)
              inStream.close();

          if (outStream != null)
              outStream.close();
      }

  }

Скачать Исходный Код

$клон git $клон git

$cd java-ввод-вывод

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-copy-file-in-java/”