2013-05-08 2 views
30

Я хочу скопировать файл из одного места в другое место на Java.Как скопировать файл из одного места в другое?

Вот то, что я до сих пор:

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

     } 
    } 
} 

Это не копирует файл, что это лучший способ сделать это?

+2

Начните с [Basic I/O] (http://docs.oracle.com/javase/tutorial/essential/io/), а также попытаться иметь взгляд на [ Копирование файла или каталога] (http://docs.oracle.com/javase/tutorial/essential/io/copy.html) – MadProgrammer

+0

Моя первая проблема заключается в том, как хранить эти файлы поиска? – vijayk

+0

Я не уверен, почему вам нужно, однако, взглянуть на [Коллекции] (http://docs.oracle.com/javase/tutorial/collections/TOC.html), я бы сосредоточился где-нибудь вокруг «Список ' – MadProgrammer

ответ

59

Вы можете использовать this (или любой другой вариант):

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

Кроме того, я бы рекомендовал использовать File.separator или / вместо \\, чтобы сделать его совместимым по нескольким OS, вопрос/ответ на этот доступный here.

Поскольку вы не знаете, как для временного хранения файлов, посмотрите на ArrayList:

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

Чтобы переместить List файлов в одном каталоге:

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

Класс файлов доступно с JDK 1.7..http: //docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html – JRR

+0

, это используется, только если вы хотите скопировать всю папку из одного места в другое. другой. Но сначала я хочу выполнить поиск, а затем скопировать только папки поиска. – vijayk

+0

@vijayk Его также можно использовать для копирования отдельных файлов ... – 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

Используйте классы Java Java Java в Java> = 7.

Создайте метод ниже и импортируйте необходимые библиотеки.

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

Используйте созданный метод, как показано ниже в основной:

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 это файл, который вы хотите скопировать в новый файл fileTo в другой папке.

Credits - @Scott: Standard concise way to copy a file in Java?

34

Использование потока

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

Использование канала

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

Использование Apache Commons IO LIB:

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

Использование Java SE 7 файлов Класс: тест

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

Производительность:

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

РЕЗУЛЬТАТЫ:

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

Ссылка:

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

+1

Спасибо, Apache Commons FileUtils сохранил мою жизнь, так как мне нужно было создать старый проект на Java 6, где nio-пакеты недоступны. 'FileUtils.copyFile (...)' еще короче/удобнее, чем nio 'Files.copy (...)' из-за отсутствия необходимости конвертировать файлы в Path. – RAM237

+1

вы можете попробовать Googles guava lib также ... посмотреть, какая версия не поддерживает Java 6 .. я буду обновлять свой пост в следующие дни –

Смежные вопросы