2013-06-18 8 views
23

sto cercando di copiare un file con java.nio.file.Files come questo:Copiare file in Java e sostituire esistente bersaglio

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

Il problema è che Eclipse dice: "Il metodo copy (Path, Path, CopyOption ...) nel tipo File non è applicabile per gli argomenti (File, String, StandardCopyOption) "

Sto utilizzando Eclipse e Java 7 su Win7 x64. Il mio progetto è impostato per utilizzare la compatibilità con Java 1.6.

c'è una soluzione a questo o devo per creare qualcosa di simile a questo come una soluzione alternativa:

File temp = new File(target); 

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

Grazie.

risposta

8

Come complemento alla risposta @assylias':

Se si utilizza Java 7, rilasciare File del tutto. Quello che vuoi è invece Path.

e per ottenere un oggetto Path corrispondenza di un percorso sul filesystem, si fa:

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

abitua in fretta. Si noti che se si utilizzano ancora API che richiedono File, Path ha un metodo .toFile().

Si noti che se si è nel caso sfortunato in cui si utilizza un'API che restituisce File oggetti, si può sempre fare:

theFileObject.toPath() 

Ma nel codice del vostro, utilizzare Path. Sistematicamente. Senza pensarci due volte.

EDIT La copia di un file su un altro utilizzando 1.6 utilizzando NIO può essere eseguita come tale; notare che la classe Closer è inspited da 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(); 
    } 
} 
+0

+1 completamente d'accordo - non uso quasi mai più i file. – assylias

+0

Mi chiedo se questo funzionerà quando compilerò il livello di conformità per Java 1.6 come accennato, ma in ogni caso grazie per la nota, lo terrò a mente per il futuro. –

+0

@commander_keen intendi il codice che verrà distribuito per eseguire 1.6 JVM? – fge

55

è necessario passare Path argomenti come spiegato dal messaggio di errore:

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

Questo presuppone che il strTarget è un percorso valido.

+0

Arg, perché ho pensato che fosse un problema con il copyOption ... Totalmente ignorato i primi due tipi di parametri, vi ringrazio. Sembra che stia codificando da troppo tempo nel caldo. ;-) –

+0

Uff, dopo aver copiato il jar esportato su un PC con Java 1.6 (ecco perché ho detto che devo essere compatibile con 1.6 anche se sviluppo con Java 7 e compilare per 1.6), si lamenta "Exception in thread" main "java.lang.NoSuchMethodError: java.io.File.toPath() Lja va/nio/file/Path;" secondo la documentazione è giusto, questo metodo è disponibile solo da Java 7. (Mi chiedo perché questo non è stato criticato durante lo sviluppo/progettazione in tempo come altre cose che ho provato ad usare da Java 7 prima, ora devo controllare tutto a mano ...) –

+0

@commander_keen 'Files.copy' non è in Java 6. – assylias

1

strTarget è un oggetto "String" e non un oggetto "Path"

Problemi correlati