Kopiowanie plików z jednego katalogu do drugiego w Javie


156

Chcę skopiować pliki z jednego katalogu do drugiego (podkatalogu) za pomocą języka Java. Mam katalog, dir, z plikami tekstowymi. Iteruję po pierwszych 20 plikach w katalogu dir i chcę je skopiować do innego katalogu w katalogu dir, który utworzyłem tuż przed iteracją. W kodzie chcę skopiować review(który reprezentuje i-ty plik tekstowy lub recenzję) do trainingDir. W jaki sposób mogę to zrobić? Wydaje się, że nie ma takiej funkcji (lub nie mogłem znaleźć). Dziękuję Ci.

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
    File review = reviews[i];

}

Więc masz katalog pełen plików i chcesz skopiować tylko te pliki? Brak rekursji po stronie wejściowej - np. Skopiować wszystko z podkatalogów do katalogu głównego?
akarnokd

Tak, dokładnie. Interesuje mnie zarówno samo skopiowanie, jak i przeniesienie tych plików do innego katalogu (choć w poście prosiłem tylko o skopiowanie).
user42155

3
Aktualizacja z przyszłości. Java 7 ma funkcję z klasy Files do kopiowania plików. Oto kolejny post na ten temat stackoverflow.com/questions/16433915/ ...
KevinL

Odpowiedzi:


170

Na razie powinno to rozwiązać Twój problem

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
    FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
    e.printStackTrace();
}

FileUtilsclass z biblioteki apache commons-io , dostępnej od wersji 1.2.

Lepszym pomysłem wydaje się używanie narzędzi innych firm zamiast samodzielnego pisania wszystkich narzędzi. Pozwala zaoszczędzić czas i inne cenne zasoby.


FileUtils nie działa dla mnie. źródło zostało potraktowane jako „E: \\ Users \\ users.usr”, a miejsce docelowe jako „D: \\ users.usr”. co może być problemem?
JAVA

2
Ładne rozwiązanie, dla mnie to działa, kiedy zmieni FileUtils.copyDirectory(source,dest)się FileUtils.copyFile(source, dest), może to doprowadzić do utworzenia katalogu jeśli nie istnieje
yuqizhang

FileUtils.copyDirectory kopiuje tylko pliki w katalogu, a nie w podkatalogach. FileUtils.copyDirectoryStructure kopiuje wszystkie pliki i podkatalogi
Homayoun Behzadian

41

W standardowym interfejsie API nie ma (jeszcze) metody kopiowania plików. Twoje opcje to:

  • Napisz to sam, używając FileInputStream, FileOutputStream i bufora do kopiowania bajtów z jednego do drugiego - lub jeszcze lepiej, użyj FileChannel.transferTo ()
  • FileUtils użytkownika Apache Commons
  • Poczekaj na NIO2 w Javie 7

+1 dla NIO2: Obecnie eksperymentuję z NIO2 / Java7 ... a nowa ścieżka jest bardzo dobrze zaprojektowana
dfa

OK, jak to zrobić w Javie 7? Łącze NIO2 jest teraz przerwane.
ripper234,

5
@ ripper234: link naprawiony. Zauważ, że znalazłem nowy link, wpisując „java nio2” w Google ...
Michael Borgwardt

Wydaje mi się, że w przypadku linku do Apache Commons chciałeś utworzyć łącze do „#copyDirectory (java.io.File, java.io.File)”
kostmo

37

W Java 7, nie jest standardową metodą kopiowania plików w Javie:

Files.copy.

Integruje się z natywnymi wejściami / wyjściami O / S, zapewniając wysoką wydajność.

Widzisz mój A on Standard zwięzły sposób kopiowania pliku w Javie? dla pełnego opisu użytkowania.


6
Nie dotyczy to kopiowania całych katalogów.
Charlie

Tak, to robi ... jeśli skorzystasz z linku. Nie zapominaj, że „Plik” w java może reprezentować katalog lub plik, to tylko odniesienie.
gagarwa

„Jeśli plik jest katalogiem, tworzy pusty katalog w lokalizacji docelowej (wpisy w katalogu nie są kopiowane)”
yurez

27

Poniższy przykład z porad dotyczących języka Java jest dość prosty. Od tego czasu przeszedłem na Groovy do operacji związanych z systemem plików - znacznie łatwiejsze i eleganckie. Ale oto wskazówki dotyczące języka Java, z których korzystałem w przeszłości. Brakuje solidnej obsługi wyjątków, która jest wymagana, aby był niezawodny.

 public void copyDirectory(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }
    }

Dziękuję, ale nie chcę kopiować katalogu - tylko zawarte w nim pliki. Teraz otrzymuję komunikaty o błędach java.io.FileNotFoundException: (ścieżka do trDir) (Jest katalogiem) Tylko tak mówi. Użyłem takiej metody: copyDirectory (recenzja, trDir);
user42155

Dzięki, lepiej sprawdzić, czy nie ma sourceLocation.exists()sprawyjava.io.FileNotFoundException
Sdghasemi

19

Jeśli chcesz skopiować plik i nie przenosić go, możesz kodować w ten sposób.

private static void copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!sourceFile.exists()) {
        return;
    }
    if (!destFile.exists()) {
        destFile.createNewFile();
    }
    FileChannel source = null;
    FileChannel destination = null;
    source = new FileInputStream(sourceFile).getChannel();
    destination = new FileOutputStream(destFile).getChannel();
    if (destination != null && source != null) {
        destination.transferFrom(source, 0, source.size());
    }
    if (source != null) {
        source.close();
    }
    if (destination != null) {
        destination.close();
    }

}

Cześć, próbowałem tego, ale otrzymuję komunikaty o błędach: java.io.FileNotFoundException: ... ścieżka do trDir ... (To katalog) Wszystko w moim pliku i folderach wydaje się być w porządku. Czy wiesz, co się dzieje nie tak i dlaczego to rozumiem?
user42155

Ale czy nie ma błędu systemu Windows związanego z transferem, z którego nie można skopiować strumieni większych niż 64 MB w jednym kawałku? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 poprawka rgagnon.com/javadetails/java-0064.html
akarnokd

Używam Ubuntu 8.10, więc nie powinno to stanowić problemu.
user42155

Jeśli masz pewność, że Twój kod nigdy nie będzie działał na innej platformie.
akarnokd

@gemm destfile musi być dokładną ścieżką, do której plik powinien zostać skopiowany. Oznacza to dołączenie nowej nazwy pliku nie tylko do katalogu, do którego chcesz skopiować plik.
Janusz

18

Spring Framework ma wiele podobnych klas użytkowych, takich jak Apache Commons Lang. Więc tam jestorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);

15

apache commons Fileutils jest przydatny. możesz wykonać poniższe czynności.

  1. kopiowanie pliku z jednego katalogu do innego katalogu.

    posługiwać się copyFileToDirectory(File srcFile, File destDir)

  2. kopiowanie katalogu z jednego katalogu do innego katalogu.

    posługiwać się copyDirectory(File srcDir, File destDir)

  3. kopiowanie zawartości jednego pliku do drugiego

    posługiwać się static void copyFile(File srcFile, File destFile)


9
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());

FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
                destinationFile);

int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
    fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();

1
czysta, prosta odpowiedź - bez dodatkowych zależności.
Clocker

Czy mógłbyś opisać pierwsze 2 wiersze!
AVA


8

Apache commons FileUtils przyda się, jeśli chcesz tylko przenosić pliki ze źródła do katalogu docelowego zamiast kopiować cały katalog, możesz zrobić:

for (File srcFile: srcDir.listFiles()) {
    if (srcFile.isDirectory()) {
        FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
    } else {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

Jeśli chcesz pominąć katalogi, możesz zrobić:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

2
copyFileToDirectory nie "przenosi" pliku
aleb

7

Wygląda na to, że szukasz prostego rozwiązania (dobrze). Polecam używanie FileUtils.copyDirectory Apache Common :

Kopiuje cały katalog do nowej lokalizacji, zachowując daty plików.

Ta metoda kopiuje określony katalog i wszystkie jego katalogi podrzędne i pliki do określonego miejsca docelowego. Miejsce docelowe to nowa lokalizacja i nazwa katalogu.

Katalog docelowy jest tworzony, jeśli nie istnieje. Jeśli katalog docelowy istnieje, ta metoda scala źródło z miejscem docelowym, przy czym pierwszeństwo ma źródło.

Twój kod mógłby wyglądać ładnie i prosto, na przykład:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");

FileUtils.copyDirectory(srcDir, trgDir);

Cześć, nie chcę kopiować katalogu - tylko pliki w nim.
user42155

To w zasadzie to samo, prawda? Wszystkie pliki z katalogu źródłowego trafią do katalogu docelowego.
Stu Thompson,

1
To znacznie lepsza metoda niż czytanie i zapisywanie plików. +1
Optimus Prime

6

Zainspirowany odpowiedzią Mohita w tym wątku . Dotyczy tylko środowiska Java 8.

Aby skopiować wszystko rekurencyjnie z jednego folderu do drugiego, można użyć następujących poleceń:

public static void main(String[] args) throws IOException {
    Path source = Paths.get("/path/to/source/dir");
    Path destination = Paths.get("/path/to/dest/dir");

    List<Path> sources = Files.walk(source).collect(toList());
    List<Path> destinations = sources.stream()
            .map(source::relativize)
            .map(destination::resolve)
            .collect(toList());

    for (int i = 0; i < sources.size(); i++) {
        Files.copy(sources.get(i), destinations.get(i));
    }
}

FTW w stylu strumieniowym.

Aktualizacja 2019-06-10: ważna uwaga - zamknij strumień (np. Używając try-with-resource) uzyskany przez wywołanie Files.walk. Dzięki @jannis za punkt.


Niesamowite!! użyj strumienia równoległego, jeśli ktoś chce skopiować katalog zawierający miliony plików. Mogę łatwo pokazać postęp kopiowania plików, ale w poleceniu copyDirectory JAVA 7 nio, dla dużego katalogu nie mogłem pokazać postępów użytkownikom.
Aqeel Haider

1
Sugeruję zamknięcie strumienia zwróconego przez Files.walk(source)zgodnie z zaleceniami w dokumentacji lub możesz mieć kłopoty
jannis

4

Poniżej znajduje się zmodyfikowany kod Briana, który kopiuje pliki z lokalizacji źródłowej do lokalizacji docelowej.

public class CopyFiles {
 public static void copyFiles(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }
            File[] files = sourceLocation.listFiles();
            for(File file:files){
                InputStream in = new FileInputStream(file);
                OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());

                // Copy the bits from input stream to output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
            }            
        }
    }

4

Java 8

Path sourcepath = Paths.get("C:\\data\\temp\\mydir");
        Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");        
        Files.walk(sourcepath)
             .forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source)))); 

Metoda kopiowania

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

3

Możesz obejść ten problem, kopiując plik źródłowy do nowego pliku i usuwając oryginał.

public class MoveFileExample {

 public static void main(String[] args) {   

    InputStream inStream = null;
    OutputStream outStream = null;

    try {

        File afile = new File("C:\\folderA\\Afile.txt");
        File bfile = new File("C:\\folderB\\Afile.txt");

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;
        //copy the file content in bytes 
        while ((length = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }

        inStream.close();
        outStream.close();

        //delete the original file
        afile.delete();

        System.out.println("File is copied successful!");

    } catch(IOException e) {
        e.printStackTrace();
    }
 }
}

2

Posługiwać się

org.apache.commons.io.FileUtils

To takie przydatne


4
Jeśli masz zamiar opublikować odpowiedź sugerującą bibliotekę, byłoby miło, gdybyś rzeczywiście wyjaśnił, jak z niej korzystać, zamiast tylko wspominać o jej nazwie.
Wyskakuje

2
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){    
    System.out.println(file.getName());

    try {
        String sourceFile=dir+"\\"+file.getName();
        String destinationFile="D:\\mital\\storefile\\"+file.getName();
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        FileOutputStream fileOutputStream = new FileOutputStream(
                        destinationFile);
        int bufferSize;
        byte[] bufffer = new byte[512];
        while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
            fileOutputStream.write(bufffer, 0, bufferSize);
        }
        fileInputStream.close();
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


1

Używam poniższego kodu do przesłania przesłanego CommonMultipartFiledo folderu i skopiowania tego pliku do folderu docelowego w folderze projektu webapps (tj.),

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();

    File file = new File(resourcepath);
    commonsMultipartFile.transferTo(file);

    //Copy File to a Destination folder
    File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
    FileUtils.copyFileToDirectory(file, destinationDir);

1

Skopiuj plik z jednego katalogu do innego katalogu ...

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();

1

tutaj jest po prostu kod java do kopiowania danych z jednego folderu do drugiego, wystarczy podać źródło i miejsce docelowe.

import java.io.*;

public class CopyData {
static String source;
static String des;

static void dr(File fl,boolean first) throws IOException
{
    if(fl.isDirectory())
    {
        createDir(fl.getPath(),first);
        File flist[]=fl.listFiles();
        for(int i=0;i<flist.length;i++)
        {

            if(flist[i].isDirectory())
            {
                dr(flist[i],false);
            }

            else
            {

                copyData(flist[i].getPath());
            }
        }
    }

    else
    {
        copyData(fl.getPath());
    }
}

private static void copyData(String name) throws IOException {

        int i;
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        System.out.println(str);
        FileInputStream fis=new FileInputStream(name);
        FileOutputStream fos=new FileOutputStream(str);
        byte[] buffer = new byte[1024];
        int noOfBytes = 0;
         while ((noOfBytes = fis.read(buffer)) != -1) {
             fos.write(buffer, 0, noOfBytes);
         }


}

private static void createDir(String name, boolean first) {

    int i;

    if(first==true)
    {
        for(i=name.length()-1;i>0;i--)
        {
            if(name.charAt(i)==92)
            {
                break;
            }
        }

        for(;i<name.length();i++)
        {
            des=des+name.charAt(i);
        }
    }
    else
    {
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        (new File(str)).mkdirs();
    }

}

public static void main(String args[]) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("program to copy data from source to destination \n");
    System.out.print("enter source path : ");
    source=br.readLine();
    System.out.print("enter destination path : ");
    des=br.readLine();
    long startTime = System.currentTimeMillis();
    dr(new File(source),true);
    long endTime   = System.currentTimeMillis();
    long time=endTime-startTime;
    System.out.println("\n\n Time taken = "+time+" mili sec");
}

}

to działający kod na to, co chcesz ... daj mi znać, czy pomogło


Zapomniałeś zamknąć FileInputStream i FileOutputStream w copyData.
everblack

0

Możesz użyć następującego kodu, aby skopiować pliki z jednego katalogu do innego

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
     // recursively copy all the files of src folder if src is a directory
     if( src.isDirectory() ) {
         // creating parent folders where source files is to be copied
         dest.mkdirs();
         for( File sourceChild : src.listFiles() ) {
             File destChild = new File( dest, sourceChild.getName() );
             copyTo( sourceChild, destChild );
         }
     } 
     // copy the source file
     else {
         InputStream in = new FileInputStream( src );
         OutputStream out = new FileOutputStream( dest );
         writeThrough( in, out );
         in.close();
         out.close();
     }
 }

0
    File file = fileChooser.getSelectedFile();
    String selected = fc.getSelectedFile().getAbsolutePath();
     File srcDir = new File(selected);
     FileInputStream fii;
     FileOutputStream fio;
    try {
         fii = new FileInputStream(srcDir);
         fio = new FileOutputStream("C:\\LOvE.txt");
         byte [] b=new byte[1024];
         int i=0;
        try {
            while ((fii.read(b)) > 0)
            {

              System.out.println(b);
              fio.write(b);
            }
            fii.close();
            fio.close();

Co to jest fileChooser?
Dinoop paloli

0

następujący kod, aby skopiować pliki z jednego katalogu do drugiego

File destFile = new File(targetDir.getAbsolutePath() + File.separator
    + file.getName());
try {
  showMessage("Copying " + file.getName());
  in = new BufferedInputStream(new FileInputStream(file));
  out = new BufferedOutputStream(new FileOutputStream(destFile));
  int n;
  while ((n = in.read()) != -1) {
    out.write(n);
  }
  showMessage("Copied " + file.getName());
} catch (Exception e) {
  showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
  if (in != null)
    try {
      in.close();
    } catch (Exception e) {
    }
  if (out != null)
    try {
      out.close();
    } catch (Exception e) {
    }
}

0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFiles {
    private File targetFolder;
    private int noOfFiles;
    public void copyDirectory(File sourceLocation, String destLocation)
            throws IOException {
        targetFolder = new File(destLocation);
        if (sourceLocation.isDirectory()) {
            if (!targetFolder.exists()) {
                targetFolder.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        destLocation);

            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
            System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());            
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            noOfFiles++;
        }
    }

    public static void main(String[] args) throws IOException {

        File srcFolder = new File("C:\\sourceLocation\\");
        String destFolder = new String("C:\\targetLocation\\");
        CopyFiles cf = new CopyFiles();
        cf.copyDirectory(srcFolder, destFolder);
        System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
        System.out.println("Successfully Retrieved");
    }
}

0

Nawet nie jest to skomplikowane i nie wymaga importu w Javie 7:

renameTo( )Metoda zmienia nazwę pliku:

public boolean renameTo( File destination)

Na przykład, aby zmienić nazwę pliku src.txtw bieżącym katalogu roboczym na dst.txt, należy napisać:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst); 

Otóż ​​to.

Odniesienie:

Harold, Elliotte Rusty (16.05.2006). Java I / O (s. 393). O'Reilly Media. Wersja Kindle.


2
Przenoszenie to nie kopiowanie.
Nathan Tuggy

Spowoduje to przeniesienie pliku. Zła odpowiedź !
smilyface

Jak określono w komentarzach do pytania, przeniesienie będzie działać dla OP.
Mohit Kanwar

Głosował za, ponieważ pasuje do mojego własnego problemu ORAZ jest najłatwiejszą odpowiedzią na przenoszenie plików. Dzięki stary
LevKaz

Proszę o udzielenie odpowiedzi związanej z pytaniem
Shaktisinh Jadeja

0

Możesz użyć następującego kodu, aby skopiować pliki z jednego katalogu do innego

public static void copyFile(File sourceFile, File destFile) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        finally {
            in.close();
            out.close();
        }
    }

0

Po funkcji rekurencyjnej napisałem, czy to komuś pomaga. Skopiuje wszystkie pliki z katalogu źródłowego do katalogu docelowego.

przykład:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
    File file = new File(currentPath);
    FileInputStream fi = null;
    FileOutputStream fo = null;

    if (file.isDirectory()) {
        String[] fileFolderNamesArray = file.list();
        File folderDes = new File(destinationPath);
        if (!folderDes.exists()) {
            folderDes.mkdirs();
        }

        for (String fileFolderName : fileFolderNamesArray) {
            rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
        }
    } else {
        try {
            File destinationFile = new File(destinationPath);

            fi = new FileInputStream(file);
            fo = new FileOutputStream(destinationPath);
            byte[] buffer = new byte[1024];
            int ind = 0;
            while ((ind = fi.read(buffer))>0) {
                fo.write(buffer, 0, ind);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if (null != fi) {
                try {
                    fi.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != fo) {
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

0

Jeśli nie chcesz korzystać z bibliotek zewnętrznych i chcesz użyć java.io zamiast klas java.nio, możesz użyć tej zwięzłej metody, aby skopiować folder i całą jego zawartość:

/**
 * Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
 * @param folderToCopy The folder and it's content that will be copied
 * @param folderDestination The folder destination
 */
public static void copyFolder(File folderToCopy, File folderDestination) {
    if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
        throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");

    folderDestination.mkdirs();

    for(File fileToCopy : folderToCopy.listFiles()) {
        File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());

        try (FileInputStream fis = new FileInputStream(fileToCopy);
             FileOutputStream fos = new FileOutputStream(copiedFile)) {

            int read;
            byte[] buffer = new byte[512];

            while ((read = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

0

Według mojej wiedzy najlepszy sposób jest następujący:

    public static void main(String[] args) {

    String sourceFolder = "E:\\Source";
    String targetFolder = "E:\\Target";
    File sFile = new File(sourceFolder);
    File[] sourceFiles = sFile.listFiles();
    for (File fSource : sourceFiles) {
        File fTarget = new File(new File(targetFolder), fSource.getName());
        copyFileUsingStream(fSource, fTarget);
        deleteFiles(fSource);
    }
}

    private static void deleteFiles(File fSource) {
        if(fSource.exists()) {
            try {
                FileUtils.forceDelete(fSource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void copyFileUsingStream(File source, File dest) {
        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);
            }
        } catch (Exception ex) {
            System.out.println("Unable to copy file:" + ex.getMessage());
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception ex) {
            }
        }
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.