file jsp 이동 - Java에서 한 디렉토리에서 다른 디렉토리로 파일 복사




14 Answers

표준 API에는 파일 복사 방법이 없습니다 (아직). 선택할 수있는 옵션은 다음과 같습니다.

  • FileInputStream, FileOutputStream 및 버퍼를 사용하여 바이트를 다른 바이트로 복사하십시오. FileChannel.transferTo() 사용하는 것이 더 좋습니다.
  • 사용자 Apache Commons의 FileUtils
  • 자바 7에서 NIO2
java file directory copy

Java를 사용하여 한 디렉토리에서 다른 디렉토리 (하위 디렉토리)로 파일을 복사하려고합니다. 텍스트 파일이있는 디렉토리가 있습니다. dir의 처음 20 개 파일을 반복하고 dir 디렉토리의 다른 디렉토리에 복사하려고합니다.이 디렉토리는 반복 전에 작성했습니다. 코드에서 review (i 번째 텍스트 파일 또는 리뷰를 나타내는)를 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];

}



Java Tips의 아래 예제는 간단합니다. 그 후 Groovy로 전환하여 파일 시스템을 다루는 작업을 훨씬 쉽고 우아하게 처리했습니다. 하지만 여기에는 과거에 사용한 Java Tips가 있습니다. 그것은 바보가되지 않게하는 데 필요한 강력한 예외 처리가 없습니다.

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



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

  1. 하나의 디렉토리에서 다른 디렉토리로 파일 복사.

    copyFileToDirectory(File srcFile, File destDir)

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

    copyDirectory(File srcDir, File destDir)

  3. 한 파일의 내용을 다른 파일로 복사

    static void copyFile(File srcFile, File destFile)




당신은 간단한 해결책 (좋은 것)을 찾고있는 것 같습니다. Apache Common의 FileUtils.copyDirectory 사용하는 것이 좋습니다.

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

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

대상 디렉토리가없는 경우 작성됩니다. 대상 디렉토리가 존재하면이 메소드는 소스를 대상과 병합하여 소스를 우선 적용합니다.

귀하의 코드는 다음과 같이 멋지고 단순 할 수 있습니다.

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

FileUtils.copyDirectory(srcDir, trgDir);






아래는 원본 위치에서 대상 위치로 파일을 복사하는 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();
            }            
        }
    }



이 스레드 에서 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.




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






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

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



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

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



Java 7에서는 복잡하고 수입이 필요하지 않습니다.

renameTo( ) 메서드는 파일의 이름을 변경합니다.

public boolean renameTo( File destination)

예를 들어, 현재 작업 디렉토리에있는 dst.txt 파일의 이름을 src.txt 로 변경하려면 다음과 같이 작성합니다.

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

그게 전부 야.

참고:

Harold, Elliotte Rusty (2006-05-16). Java I / O (391 페이지 참조). O'Reilly Media. 킨들 에디션.




누군가를 돕는다면 필자는 재귀 적 함수를 따라 작성했다. 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();
                }
            }
        }
    }
}



Related