2013-05-08 21 views
30

Bir dosyayı bir konumdan Java'daki başka bir konuma kopyalamak istiyorum.Dosya bir konumdan başka bir konuma nasıl kopyalanır?

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

     } 
    } 
} 

Bu dosyayı kopyalamaz, bunu yapmanın en iyi yolu nedir: İşte

var bugüne kadar ne?

+2

ile Başlat [Temel G/Ç] (http://docs.oracle.com/javase/tutorial/essential/io/) ve ayrıca bir göz olması deneyin [ Bir Dosya veya Dizini Kopyalama] (http://docs.oracle.com/javase/tutorial/essential/io/copy.html) – MadProgrammer

+0

İlk problemim bu arama dosyalarının nasıl saklanacağıdır? – vijayk

+0

Neden ihtiyaç duyacağınızdan emin değilim, [Koleksiyonlar] 'a (http://docs.oracle.com/javase/tutorial/collections/TOC.html) bir göz atın; ' – MadProgrammer

cevap

59

Sen this (veya herhangi bir varyantı) kullanabilirsiniz:

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

Ayrıca, bundan mevcut here birden OS, soru/cevap karşısında o uyumlu hale getirmek için File.separator veya yerine \\ ait / kullanarak öneriyoruz.

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

Dosya sınıfı JDK 1.7..http: //docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html – JRR

+0

'dan beri kullanılabilir, bu sadece tüm klasörü bir konumdan kopyalamak istediğinizde kullanılır. başka bir .Ama önce aramak ve sonra sadece arama klasörlerini kopyalamak istiyorum. – vijayk

+0

@vijayk Ayrıca, tek tek dosyaları kopyalamak için de kullanılabilir ... – 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

:

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

tek bir dizinde dosyaların List taşımak için: geçici dosyaları saklamak ArrayList bakmak nasıl emin değiliz yana

Java'da Yeni Java Dosyası sınıflarını kullanın> = 7.

Aşağıdaki yöntemi oluşturun ve gerekli lib'leri içe aktarın.

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

ana dahilinde aşağıda oluşturulan yöntemi kullanın:

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

Not: - fileFrom farklı bir klasörde yeni dosyaya fileto kopyalamak istediğiniz dosyadır.Apache Commons IO lib kullanma Kanal

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

kullanma Akışı

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

kullanma Standard concise way to copy a file in Java?

34

:

@Scott -

Kredi

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

kullanma Java SE 7 Dosyalar sınıfı:

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

Performans testi:

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

BULGULAR:

/* 
* 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 
*/ 

Bağlantı:

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

+1

Teşekkürler, Apache Commons FileUtils, nio paketlerinin mevcut olmadığı eski Java 6 projesini oluşturmam gerektiğinden hayatımı kurtardı. 'FileUtils.copyFile (...)' nio 'Files.copy (...)' dan daha kısa/kullanışlıdır. – RAM237

+1

Googles guava lib'i de deneyebilirsiniz ... bazı versiyonları izleyin Java 6'yı desteklemiyor .. Gelecek günlerde mesajımı güncelleyeceğim –