Search code examples
javafilereplacecopy

Copy file in Java and replace existing target


I'm trying to copy a file with java.nio.file.Files like this:

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

The problem is that Eclipse says "The method copy(Path, Path, CopyOption...) in the type Files is not applicable for the arguments (File, String, StandardCopyOption)"

I'm using Eclipse and Java 7 on Win7 x64. My project is set up to use Java 1.6 compatibility.

Is there a solution to this or do I have to create something like this as a workaround:

File temp = new File(target);

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

Thanks.


Solution

  • As a complement to @assylias' answer:

    If you use Java 7, drop File entirely. What you want is Path instead.

    And to get a Path object matching a path on your filesystem, you do:

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

    Get used to it real fast. Note that if you still use APIs which require File, Path has a .toFile() method.

    Note that if you are in the unfortunate case where you use an API which returns File objects, you can always do:

    theFileObject.toPath()
    

    But in code of yours, use Path. Systematically. Without a second thought.

    EDIT Copying a file to another using 1.6 using NIO can be done as such; note that the Closer class is inspited by 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();
        }
    }