programing

Java에서 한 디렉토리에서 다른 디렉토리로 파일 복사

newsource 2022. 8. 25. 00:00

Java에서 한 디렉토리에서 다른 디렉토리로 파일 복사

Java를 사용하여 한 디렉토리에서 다른 디렉토리(서브 디렉토리)로 파일을 복사하고 싶습니다. 처음 의 다른 디렉토리는 dir.dir의 20개 전입니다.이 디렉토리는 반복 직전에 작성한 것입니다.'이렇게 하다', '이렇게 하다'를 따라하고 요.review리뷰를 에서 (ith 텍스트 파일 또는 리뷰를 나타냄)로trainingDir떻게게 해???그런 기능은 없는 것 같습니다(혹은 찾을 수 없었습니다).사합니니다다

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

}

지금으로서는 이것으로 당신의 문제가 해결될 것입니다.

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

FileUtils버전 1.2 이후 사용할 수 있는 Apache Commons-io 라이브러리의 클래스입니다.

모든 유틸리티를 직접 작성하는 대신 서드파티 툴을 사용하는 것이 더 좋은 생각인 것 같습니다.시간과 다른 귀중한 자원을 절약할 수 있습니다.

Standard API에는 아직 파일 복사 방법이 없습니다.옵션은 다음과 같습니다.

  • FileInputStream, FileOutputStream 및 버퍼를 사용하여 바이트를 복사하거나 FileChannel.transferTo()사용합니다.
  • 사용자 Apache Commons의 FileUtils
  • Java 7에서 NIO2 대기

Java 7에서는 Java에서 파일을 복사하는 표준 방법이 있습니다.

Files.copy.

O/S 네이티브 I/O와 통합되어 고성능입니다.

Java에서 파일을 복사하는 간결한 방법은 A on Standard를 참조하십시오.사용방법에 대한 자세한 내용은 를 참조하십시오.

Java Tips의 다음 예는 비교적 간단합니다.그 후 파일 시스템을 다루는 작업을 위해 Groovy로 전환했습니다. 훨씬 쉽고 우아합니다.하지만 여기 제가 예전에 썼던 자바 팁이 있습니다.완전무결하게 만드는 데 필요한 강력한 예외 처리 기능이 없습니다.

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

파일을 이동하지 않고 복사하려면 다음과 같이 코드화할 수 있습니다.

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

}

apache commons Fileutils는 편리합니다.아래의 활동을 할 수 있습니다.

  1. 한 디렉토리에서 다른 디렉토리로 파일을 복사합니다.

    copyFileToDirectory(File srcFile, File destDir)

  2. 디렉토리를 다른 디렉토리로 복사합니다.

    copyDirectory(File srcDir, File destDir)

  3. 파일 내용 복사

    static void copyFile(File srcFile, File destFile)

Spring Framework에는 Apache Commons Lang과 같은 유사한 유틸리티 클래스가 많이 있습니다.그래서 있다org.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
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();

당신은 간단한 해결책을 찾고 있는 것 같군요.Apache Common의 FileUtils.copyDirectory를 사용할 것을 권장합니다.

파일 날짜를 보존하는 새 위치에 디렉터리 전체를 복사합니다.

이 메서드는 지정된 디렉토리와 모든 하위 디렉토리 및 파일을 지정된 대상에 복사합니다.수신처는 디렉토리의 새 위치와 이름입니다.

행선지 디렉토리가 없는 경우는, 그 디렉토리가 작성됩니다.행선지 디렉토리가 존재하는 경우, 이 메서드는, 송신원과 행선지를 Marge 해, 송신원이 우선합니다.

코드는 다음과 같이 단순할 수 있습니다.

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

FileUtils.copyDirectory(srcDir, trgDir);
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

출처 : https://docs.oracle.com/javase/tutorial/essential/io/copy.html

Apache Commons FileUtils는 디렉토리 전체를 복사하는 것이 아니라 소스 디렉토리에서 타깃 디렉토리로만 파일을 이동하려는 경우 다음을 수행할 수 있습니다.

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

디렉토리를 건너뛸 경우 다음을 수행할 수 있습니다.

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

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

복사 방법

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

Mohit의 답변에서 영감을 얻었다.Java 8에만 적용됩니다.

폴더 간에 모든 것을 재귀적으로 복사하려면 다음을 사용할 수 있습니다.

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

Upd 2019-06-10: 중요 참고 - 파일이 획득한 스트림(예: 리소스 사용)을 닫습니다.워크콜@jannis님 덕분입니다.

다음은 원본 위치에서 대상 위치로 파일을 복사하는 Brian의 수정된 코드입니다.

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

소스 파일을 새 파일에 복사하고 원본 파일을 삭제하는 문제를 해결할 수 있습니다.

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

이렇게 하면 파일이 손상되는 것을 방지할 수 있습니다.

다음 항아리를 다운로드하세요!
Jar 파일
다운로드 페이지

import org.springframework.util.FileCopyUtils;

private static void copyFile(File source, File dest) throws IOException {
    //This is safe and don't corrupt files as FileOutputStream does
    File src = source;
    File destination = dest;
    FileCopyUtils.copy(src, dest);
}

NIO 클래스는 이것을 매우 단순하게 합니다.

http://www.javalobby.org/java/forums/t17036.html

사용하다

org.apache.commons.io.FileUtils

너무 편해

업로드된 파일을 전송하기 위해 다음 코드를 사용합니다.CommonMultipartFile폴더에 파일을 복사하여 웹 앱(예: 웹 프로젝트 폴더)의 대상 폴더에 복사합니다.

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

한 디렉토리에서 다른 디렉토리로 파일 복사...

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

한 폴더에서 다른 폴더로 데이터를 복사하기 위한 자바 코드입니다. 소스와 수신처를 입력하기만 하면 됩니다.

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

}

이건 네가 원하는 걸 위한 작업 코드야도움이 됐는지 알려주세요

내가 알고 있는 최선의 방법은 다음과 같다.

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

다음 코드를 사용하여 한 디렉토리에서 다른 디렉토리로 파일을 복사할 수 있습니다.

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

한 디렉토리에서 다른 디렉토리로 파일을 복사하는 다음 코드

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

Java 7에서는 그다지 복잡하지 않고 Import도 필요 없습니다.

renameTo( )는 파일합니다. 파일 이름을 변경합니다.

public boolean renameTo( File destination)

를 들어,하려면 , 「」를 참조해 주세요.src.txt에서 " "로 이동합니다.dst.txt

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

바로 그겁니다.

레퍼런스:

해롤드, 엘리엇 러스티 (2006-05-16)자바 I/O (p.393).오라일리 미디어.킨들 에디션

다음 코드를 사용하여 한 디렉토리에서 다른 디렉토리로 파일을 복사할 수 있습니다.

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

내가 쓴 재귀 함수에 따라, 누군가에게 도움이 된다면.sourcedirectory 내의 모든 파일을 destinationDirectory에 복사합니다.

예:

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

언급URL : https://stackoverflow.com/questions/1146153/copying-files-from-one-directory-to-another-in-java