Подтвердить что ты не робот

Скопируйте файл на Java и замените существующий объект

Я пытаюсь скопировать файл с java.nio.file.Files следующим образом:

Files.copy(cfgFilePath, strTarget, StandardCopyOption.REPLACE_EXISTING);

Проблема в том, что Eclipse говорит: "Копия метода (Path, Path, CopyOption...) в типе" Файлы "не применима для аргументов (File, String, StandardCopyOption)"

Я использую Eclipse и Java 7 на Win7 x64. Мой проект настроен на использование совместимости с Java 1.6.

Есть ли решение для этого или мне нужно создать что-то вроде этого в качестве обходного пути:

File temp = new File(target);

if(temp.exists())
  temp.delete();

Спасибо.

4b9b3361

Ответ 1

В качестве дополнения к ответу @assylias:

Если вы используете Java 7, полностью отбросьте File. Вместо этого вы хотите Path.

И чтобы получить объект Path, соответствующий пути в вашей файловой системе, выполните следующие действия:

Paths.get("path/to/file"); // argument may also be absolute

Привыкнуть к нему очень быстро. Обратите внимание: если вы все еще используете API, для которых требуется File, Path имеет метод .toFile().

Обратите внимание: если вы находитесь в неудачном случае, когда используете API, который возвращает объекты File, вы всегда можете:

theFileObject.toPath()

Но в вашем коде используйте Path. Систематически. Без второй мысли.

EDIT Копирование файла в другой с использованием 1.6 с использованием NIO может быть выполнено как таковое; обратите внимание, что класс Closer вдохновлен Guava:

public final class Closer
    implements Closeable
{
    private final List<Closeable> closeables = new ArrayList<Closeable>();

    // @Nullable is a JSR 305 annotation
    public <T extends Closeable> T add(@Nullable final T closeable)
    {
        closeables.add(closeable);
        return closeable;
    }

    public void closeQuietly()
    {
        try {
            close();
        } catch (IOException ignored) {
        }
    }

    @Override
    public void close()
        throws IOException
    {
        IOException toThrow = null;
        final List<Closeable> l = new ArrayList<Closeable>(closeables);
        Collections.reverse(l);

        for (final Closeable closeable: l) {
            if (closeable == null)
                continue;
            try {
                closeable.close();
            } catch (IOException e) {
                if (toThrow == null)
                    toThrow = e;
            }
        }

        if (toThrow != null)
            throw toThrow;
    }
}

// Copy one file to another using NIO
public static void doCopy(final File source, final File destination)
    throws IOException
{
    final Closer closer = new Closer();
    final RandomAccessFile src, dst;
    final FileChannel in, out;

    try {
        src = closer.add(new RandomAccessFile(source.getCanonicalFile(), "r");
        dst = closer.add(new RandomAccessFile(destination.getCanonicalFile(), "rw");
        in = closer.add(src.getChannel());
        out = closer.add(dst.getChannel());
        in.transferTo(0L, in.size(), out);
        out.force(false);
    } finally {
        closer.close();
    }
}

Ответ 2

Вам необходимо передать аргументы Path, как описано в сообщении об ошибке:

Path from = cfgFilePath.toPath(); //convert from File to Path
Path to = Paths.get(strTarget); //convert from String to Path
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);

Это предполагает, что ваш strTarget является допустимым путем.

Ответ 3

strTarget - это объект "String", а не объект "Path"