Java'da dosyaları bir dizinden diğerine kopyalama


156

Java kullanarak dosyaları bir dizinden diğerine (alt dizine) kopyalamak istiyorum. Bir dizin, dir, metin dosyaları var. Dir içindeki ilk 20 dosya üzerinde yineleme, ve yineleme önce oluşturduğum dir dizinde başka bir dizine kopyalamak istiyorum. Kodda, review(i metin dosyasını veya incelemeyi temsil eden) kopyalamak istiyorum trainingDir. Bunu nasıl yapabilirim? Böyle bir işlev yok gibi görünüyor (ya da bulamadım). Teşekkür ederim.

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

}

Yani, dosyalarla dolu bir dizininiz var ve bu dosyaları sadece kopyalamak mı istiyorsunuz? Giriş tarafında özyineleme yok - örn. Her şeyi alt dizinlerden ana dizine kopyalansın mı?
akarnokd

Evet kesinlikle. Bu dosyaları kopyalamak veya başka bir dizine taşımakla ilgileniyorum (mesajda sadece kopyalama için istedim).
user42155

3
Gelecekten güncelleme. Java 7, Files sınıfından dosyaları kopyalamak için bir özelliğe sahiptir . İşte bu konuda başka bir yazı stackoverflow.com/questions/16433915/…
KevinL

Yanıtlar:


170

Şimdilik bu sorununuzu çözmeli

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

FileUtils1.2 sürümünden beri kullanılabilen apache commons-io kütüphanesinden bir sınıf .

Tüm araçları kendi başımıza yazmak yerine üçüncü taraf araçlarını kullanmak daha iyi bir fikir gibi görünüyor. Zamandan ve diğer değerli kaynaklardan tasarruf edebilir.


FileUtils benim için çalışmadı. kaynak i "E: \\ Kullanıcılar \\ users.usr" ve hedef "D: \\ users.usr" olarak alınmıştır. sorun ne olabilir?
JAVA

2
Ben değiştirdiğinizde Güzel çözüm, benim için çalıştığını FileUtils.copyDirectory(source,dest)üzere FileUtils.copyFile(source, dest), bu dizini oluşturabilirsiniz o yoksa
yuqizhang

FileUtils.copyDirectory, dosyaları yalnızca alt dizinlere değil dizine kopyalar. FileUtils.copyDirectoryStructure tüm dosyaları ve alt dizinleri kopyalar
Homayoun Behzadian

41

Standart API'da (henüz) dosya kopyalama yöntemi yoktur. Seçenekleriniz:

  • Baytları birinden diğerine kopyalamak için FileInputStream, FileOutputStream ve bir arabellek kullanarak kendiniz yazın - veya daha iyisi, FileChannel.transferTo () öğesini kullanın
  • Kullanıcı Apache Commons ' FileUtils
  • Java 7'de NIO2'yi bekleyin

NIO2 için +1: Bu günlerde NIO2 / Java7 ile denemeler yapıyorum .. ve yeni Yol çok iyi tasarlanmış
dfa

Tamam, Java 7'de nasıl yapılır? NIO2 bağlantısı kesildi.
ripper234

5
@ ripper234: bağlantı düzeltildi. Yeni bağlantıyı Google'a "java nio2" girerek bulduğumu unutmayın ...
Michael

Apache Commons bağlantısı için, "#copyDirectory (java.io.File, java.io.File)"
kostmo

37

Java 7'de orada olduğunu java dosyaları kopyalamak için standart bir yöntem:

Files.copy.

Yüksek performans için O / S doğal I / O ile entegre olur.

Benim bir bakın Standart özlü bir şekilde Java bir dosyayı kopyalamak için? Kullanımın tam açıklaması için.


6
Bu, tüm dizinlerin kopyalanması sorununu ele almaz.
Charlie

Evet öyle ... bağlantıyı izlerseniz. Java'daki bir "Dosya" nın bir dizini veya dosyayı temsil edebileceğini unutmayın, sadece bir referanstır.
gagarwa

"Dosya bir
dizinse

27

Java Tips'ten aşağıdaki örnek oldukça basittir. O zamandan beri çok daha kolay ve zarif - dosya sistemi ile ilgili işlemler için Groovy'ye geçtim. Ama işte geçmişte kullandığım Java İpuçları. Kusursuz hale getirmek için gereken sağlam istisna işleminden yoksundur.

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

Teşekkür ederim, ama dizini kopyalamak istemiyorum - sadece içindeki dosyaları. Şimdi java.io.FileNotFoundException hata mesajları alıyorum: (trDir yolu) (bir dizin var) Bu sadece ne diyor. Böyle bir yöntem kullandım: copyDirectory (review, trDir);
user42155

Teşekkürler, sourceLocation.exists()önlemek durumunda kontrol etmek daha iyidirjava.io.FileNotFoundException
Sdghasemi

19

Bir dosyayı kopyalamak ve taşımak istemiyorsanız bu şekilde kod yazabilirsiniz.

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

}

Merhaba, bunu denedim, ama hata iletileri almak: java.io.FileNotFoundException: ... trDir yolu ... (Bir dizin var) Dosya ve klasörlerimdeki her şey yolunda gibi görünüyor. Neyin yanlış gittiğini ve bunu neden anladığımı biliyor musunuz?
user42155

Ancak aktarımın etrafında 64MB'den büyük akışları tek bir parçada kopyalayamayan bir Windows hatası yok mu? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 düzeltme rgagnon.com/javadetails/java-0064.html
akarnokd

Ubuntu 8.10 kullanıyorum, bu yüzden bu sorun olmamalı.
user42155

Kodunuzun hiçbir zaman farklı bir platformda çalışmadığından eminseniz.
akarnokd

@gemm destfile dosyanın kopyalanması gereken tam yol olmalıdır. Bu, yalnızca dosyayı kopyalamak istediğiniz dizinin değil, yeni dosya adının dahil edilmesi anlamına gelir.
Janusz

18

Spring Framework , Apache Commons Lang gibi birçok benzer util sınıfına sahiptir. İşte burdaorg.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 kullanışlıdır. aşağıdaki aktiviteleri yapabilirsiniz.

  1. dosyayı bir dizinden başka bir dizine kopyalama.

    kullanım copyFileToDirectory(File srcFile, File destDir)

  2. dizini bir dizinden başka bir dizine kopyalama.

    kullanım copyDirectory(File srcDir, File destDir)

  3. bir dosyanın içeriğini diğerine kopyalama

    kullanım 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
temiz, basit cevap - ekstra bağımlılık yok.
Clocker

Lütfen ilk 2 satırı anlatır mısınız?
AVA


8

Apache commons FileUtils kullanışlı olacaktır, eğer dosyaları dizinin tamamını kopyalamak yerine hedef dizine taşımak istiyorsanız , şunları yapabilirsiniz:

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

Dizinleri atlamak istiyorsanız şunları yapabilirsiniz:

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

2
copyFileToDirectory dosyayı "
taşımıyor

7

Basit bir çözüm arıyor görünüyorsunuz (iyi bir şey). Apache Common'un FileUtils.copyDirectory öğesini kullanmanızı öneririm :

Dizinin tamamını dosya tarihlerini koruyarak yeni bir konuma kopyalar.

Bu yöntem, belirtilen dizini ve tüm alt dizinlerini ve dosyalarını belirtilen hedefe kopyalar. Hedef dizinin yeni konumu ve adıdır.

Hedef dizin mevcut değilse oluşturulur. Hedef dizin mevcutsa, bu yöntem kaynağı hedefle birleştirir ve kaynak öncelik kazanır.

Kodunuz bu şekilde hoş ve basit olabilir:

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

FileUtils.copyDirectory(srcDir, trgDir);

Merhaba, dizini kopyalamak istemiyorum - sadece içindeki dosyaları.
user42155

Temelde aynı şey, değil mi? Kaynak dizindeki tüm dosyalar hedef dizine gelecektir.
Stu Thompson

1
Bu dosyaları okumak ve yazmaktan çok daha iyi bir yöntem. +1
Optimus Prime

6

Mohit'in bu konudaki cevabından ilham aldı . Yalnızca Java 8 için geçerlidir.

Aşağıdakiler her şeyi bir klasörden diğerine özyinelemeli olarak kopyalamak için kullanılabilir:

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

Akış tarzı FTW.

Upgrade 2019-06-10: önemli not - Files.walk çağrısı tarafından alınan akışı kapatın (örneğin, kaynakla dene). Bu nokta için @jannis'e teşekkürler.


Korku veren !! Herkes milyonlarca dosya içeren dizini kopyalamak istiyorsa paralel Akış kullanın. Dosyaları kopyalamanın ilerlemesini kolayca gösterebilirim, ancak JAVA 7 nio copyDirectory komutunda, büyük dizin için kullanıcılar için ilerleme gösteremedim.
Aqeel Haider

1
DokümanlardaFiles.walk(source) önerildiği gibi döndürülen akışı kapatmanızı öneririm yoksa
başınız

4

Brian'ın dosyaları kaynak konumdan hedef konuma kopyalayan değiştirilmiş kodu aşağıdadır.

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

Kopyalama Yöntemi

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

Kaynak dosyayı yeni bir dosyaya kopyalayıp orijinali silebilirsiniz.

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

kullanım

org.apache.commons.io.FileUtils

Çok kullanışlı


4
Bir kütüphane öneren bir cevap gönderecekseniz, sadece adını belirtmek yerine nasıl kullanılacağını açıklamanız iyi olur.
Pops

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

yüklenen CommonMultipartFilebir klasöre aktarmak ve bu dosyayı webapps (ie) web proje klasöründeki bir hedef klasöre kopyalamak için aşağıdaki kodu kullanın ,

    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

Dosyayı bir dizinden başka bir dizine kopyala ...

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

burada sadece bir klasörden diğerine veri kopyalamak için bir java kodu, sadece kaynak ve hedef girişini vermek zorunda.

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

}

Bu istediğiniz için bir çalışma kodu .. bana yardımcı olup olmadığını bildirin


CopyData içinde FileInputStream ve FileOutputStream öğelerini kapatmayı unuttunuz.
everblack

0

Dosyaları bir dizinden diğerine kopyalamak için aşağıdaki kodu kullanabilirsiniz

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

Nedir fileChooser?
Dinoop paloli

0

dosyaları bir dizinden diğerine kopyalamak için aşağıdaki kod

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

Java 7'de bu kadar karmaşık ve ithalat gerektirmez:

renameTo( )Yöntem, bir dosyanın adını değiştirir:

public boolean renameTo( File destination)

Örneğin src.txt, geçerli çalışma dizinindeki dosyanın adını olarak değiştirmek için şunu dst.txtyazarsınız:

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

Bu kadar.

Referans:

Harold, Elliotte Rusty (2006-05-16). Java I / O (s.393). O'Reilly Media. Kindle Sürümü.


2
Taşımak kopyalanmıyor.
Nathan Tuggy

Bu dosyayı taşıyacaktır. Yanlış cevap !
smilyface

Söz konusu yorumlarda belirtildiği gibi, taşıma OP için çalışacaktır.
Mohit Kanwar

Bu benim sorunum için uygun ve dosyaları taşımak için orada en kolay cevap olduğu için seçildi. Thanks dude
LevKaz

Lütfen soru ile ilgili cevap verin
Shaktisinh Jadeja

0

Dosyaları bir dizinden diğerine kopyalamak için aşağıdaki kodu kullanabilirsiniz

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

Özyinelemeli fonksiyonun ardından kimseye yardımcı olursa yazdım. Kaynak dizin içindeki tüm dosyaları destinationDirectory dizinine kopyalar.

misal:

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

Harici kitaplıkları kullanmak istemiyorsanız ve java.nio sınıfları yerine java.io kullanmak istiyorsanız, bir klasör ve tüm içeriğini kopyalamak için bu kısa yöntemi kullanabilirsiniz:

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

Bildiğim kadarıyla en iyi yolu aşağıdaki gibidir:

    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) {
            }
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.