2013-05-08 29 views
30

Chcę skopiować plik z jednej lokalizacji do innej lokalizacji w Javie.Jak skopiować plik z jednej lokalizacji do innej?

Oto co mam do tej pory:

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.List; 
public class TestArrayList { 
    public static void main(String[] args) { 
     File f = new File(
      "D:\\CBSE_Demo\\Demo_original\\fscommand\\contentplayer\\config"); 
     List<String>temp=new ArrayList<String>(); 
     temp.add(0, "N33"); 
     temp.add(1, "N1417"); 
     temp.add(2, "N331"); 
     File[] matchingFiles = null; 
     for(final String temp1: temp){ 
      matchingFiles = f.listFiles(new FilenameFilter() { 
       public boolean accept(File dir, String name) { 
        return name.startsWith(temp1); 
       } 
      }); 
      System.out.println("size>>--"+matchingFiles.length); 

     } 
    } 
} 

nie skopiować plik, co jest najlepszym sposobem, aby to zrobić?

+2

Zacznij [Podstawowe I/O] (http://docs.oracle.com/javase/tutorial/essential/io/), a także spróbować zaglądając do [ Kopiowanie pliku lub katalogu] (http://docs.oracle.com/javase/tutorial/essential/io/copy.html) – MadProgrammer

+0

Mój pierwszy problem polega na tym, jak przechowywać te pliki wyszukiwania? – vijayk

+0

Nie jestem pewien, dlaczego potrzebowałbyś, ale spójrz na [Kolekcje] (http://docs.oracle.com/javase/tutorial/collections/TOC.html), skupiłbym się gdzieś w pobliżu 'List ' – MadProgrammer

Odpowiedz

59

Można użyć this (lub dowolny wariant):

Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); 

Również polecam korzystania File.separator lub / zamiast \\ aby zgodny całej stwardnienie OS, pytania/odpowiedzi na ten dostępny here.

Ponieważ nie jesteś pewien, jak do tymczasowego przechowywania plików przyjrzeć ArrayList:

List<File> files = new ArrayList(); 
files.add(foundFile); 

Aby przenieść List plików w jednym katalogu:

List<File> files = ...; 
String path = "C:/destination/"; 
for(File file : files) { 
    Files.copy(file.toPath(), 
     (new File(path + file.getName())).toPath(), 
     StandardCopyOption.REPLACE_EXISTING); 
} 
+0

Klasy plików jest dostępny, ponieważ JDK 1.7..http: //docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html – JRR

+0

jest używany tylko wtedy, gdy chcesz skopiować cały folder z jednej lokalizacji na inny .Ale chcę najpierw wyszukać, a następnie skopiować tylko te foldery wyszukiwania. – vijayk

+0

@vijayk Może być również używany do kopiowania pojedynczych plików ... – MadProgrammer

4
public static void copyFile(File oldLocation, File newLocation) throws IOException { 
     if (oldLocation.exists()) { 
      BufferedInputStream reader = new BufferedInputStream(new FileInputStream(oldLocation)); 
      BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(newLocation, false)); 
      try { 
       byte[] buff = new byte[8192]; 
       int numChars; 
       while ((numChars = reader.read( buff, 0, buff.length)) != -1) { 
        writer.write(buff, 0, numChars); 
       } 
      } catch(IOException ex) { 
       throw new IOException("IOException when transferring " + oldLocation.getPath() + " to " + newLocation.getPath()); 
      } finally { 
       try { 
        if (reader != null){      
         writer.close(); 
         reader.close(); 
        } 
       } catch(IOException ex){ 
        Log.e(TAG, "Error closing files when transferring " + oldLocation.getPath() + " to " + newLocation.getPath()); 
       } 
      } 
     } else { 
      throw new IOException("Old location does not exist when transferring " + oldLocation.getPath() + " to " + newLocation.getPath()); 
     } 
    } 
3

Użyj nowych klas plików Java w języku Java> = 7.

Utwórz poniższą metodę i zaimportuj niezbędne biblioteki.

public static void copyFile(File from, File to) throws IOException { 
    Files.copy(from.toPath(), to.toPath()); 
} 

Użyj utworzonego metodę jak poniżej ciągu głównego:

File dirFrom = new File(fileFrom); 
File dirTo = new File(fileTo); 

try { 
     copyFile(dirFrom, dirTo); 
} catch (IOException ex) { 
     Logger.getLogger(TestJava8.class.getName()).log(Level.SEVERE, null, ex); 
} 

NB: - fileFrom jest plik, który chcesz skopiować do nowego pliku fileTo w innym folderze.

kuponów - @Scott: Standard concise way to copy a file in Java?

34

Korzystanie Stream

private static void copyFileUsingStream(File source, File dest) throws IOException { 
    InputStream is = null; 
    OutputStream os = null; 
    try { 
     is = new FileInputStream(source); 
     os = new FileOutputStream(dest); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = is.read(buffer)) > 0) { 
      os.write(buffer, 0, length); 
     } 
    } finally { 
     is.close(); 
     os.close(); 
    } 
} 

użyciem kanału

private static void copyFileUsingChannel(File source, File dest) throws IOException { 
    FileChannel sourceChannel = null; 
    FileChannel destChannel = null; 
    try { 
     sourceChannel = new FileInputStream(source).getChannel(); 
     destChannel = new FileOutputStream(dest).getChannel(); 
     destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); 
     }finally{ 
      sourceChannel.close(); 
      destChannel.close(); 
     } 
} 

Korzystanie z Apache Commons IO lib:

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { 
    FileUtils.copyFile(source, dest); 
} 

Korzystanie Java SE 7 klasa Files: test

private static void copyFileUsingJava7Files(File source, File dest) throws IOException { 
    Files.copy(source.toPath(), dest.toPath()); 
} 

Wydajność:

File source = new File("/Users/pankaj/tmp/source.avi"); 
    File dest = new File("/Users/pankaj/tmp/dest.avi"); 


    //copy file conventional way using Stream 
    long start = System.nanoTime(); 
    copyFileUsingStream(source, dest); 
    System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start)); 

    //copy files using java.nio FileChannel 
    source = new File("/Users/pankaj/tmp/sourceChannel.avi"); 
    dest = new File("/Users/pankaj/tmp/destChannel.avi"); 
    start = System.nanoTime(); 
    copyFileUsingChannel(source, dest); 
    System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start)); 

    //copy files using apache commons io 
    source = new File("/Users/pankaj/tmp/sourceApache.avi"); 
    dest = new File("/Users/pankaj/tmp/destApache.avi"); 
    start = System.nanoTime(); 
    copyFileUsingApacheCommonsIO(source, dest); 
    System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start)); 

    //using Java 7 Files class 
    source = new File("/Users/pankaj/tmp/sourceJava7.avi"); 
    dest = new File("/Users/pankaj/tmp/destJava7.avi"); 
    start = System.nanoTime(); 
    copyFileUsingJava7Files(source, dest); 
    System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start)); 

WYNIKI:

/* 
* File copy: 
* Time taken by Stream Copy   = 44582575000 
* Time taken by Channel Copy   = 104138195000 
* Time taken by Apache Commons IO Copy = 108396714000 
* Time taken by Java7 Files Copy  = 89061578000 
*/ 

Link:

http://www.journaldev.com/861/4-ways-to-copy-file-in-java

+1

Dzięki, Apache Commons FileUtils uratowało mi życie, ponieważ musiałem zbudować stary projekt Java 6, w którym pakiety nio nie są dostępne. 'FileUtils.copyFile (...)' jest jeszcze krótszy/poręczniejszy niż nio 'Files.copy (...)' z powodu braku konwersji plików do Path. – RAM237

+1

możesz wypróbować guankową bibliotekę Googles również ... uważaj na niektóre wersje nie obsługuj języka Java 6 .. zaktualizuję mój wpis na następne dni –

Powiązane problemy