web-dev-qa-db-ja.com

Javaのファイルをコピーし、既存のターゲットを置き換えます

私はこのようなJava.nio.file.Filesでファイルをコピーしようとしています:

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

問題は、Eclipseが「Files型のメソッドcopy(Path、Path、CopyOption ...)は引数(File、String、StandardCopyOption)に適用できない」ということです。

EclipseとWin7 x64でJava 7を使用しています。私のプロジェクトはJava 1.6互換性を使用するように設定されています。

これに対する解決策はありますか、回避策としてこのようなものを作成する必要がありますか?

File temp = new File(target);

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

ありがとう。

37
commander_keen

@assyliasの答えを補完するものとして:

Java 7)を使用する場合、Fileを完全に削除します。代わりにPathを使用します。

そして、ファイルシステム上のパスに一致するPathオブジェクトを取得するには、次のようにします。

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

すぐに慣れてください。 Fileを必要とするAPIを引き続き使用する場合、Pathには.toFile()メソッドがあります。

Fileオブジェクトを返すAPIを使用するという不幸な場合は、いつでも実行できることに注意してください。

_theFileObject.toPath()
_

しかし、あなたのコードでは、Pathを使用します。体系的に。考え直しなし。

[〜#〜] edit [〜#〜]NIOを使用して1.6を使用してファイルを別のファイルにコピーすることもできます。 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();
    }
}
_
10
fge

エラーメッセージで説明されているように、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が有効なパスであることを前提としています。

95
assylias

strTargetは「Path」オブジェクトではなく「String」オブジェクトです

1
vincentcjl
package main.Java;

import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Path;
import Java.nio.file.Paths;
import Java.nio.file.StandardCopyOption;

public class CopyFileOnExist {

    public static void main(String[] args)  {

        Path sourceDirectory = Paths.get("C:/Users/abc/Downloads/FileNotFoundExceptionExample/append.txt");
        Path targetDirectory = Paths.get("C:/Users/abc/Downloads/FileNotFoundExceptionExample/append5.txt");

        //copy source to target using Files Class
        try {
            Files.copy(sourceDirectory, targetDirectory,StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }

}
0
ABHAY JOHRI