[Java] 자바로 폴더(디렉토리),파일 복사하기
- Language/Java
- 2018. 12. 27.
자바 File클래스에는 폴더에있는 모든 파일정보를 가지고 오는 메서드인 listFiles()라는 메서드가 존재합니다. 이 listFiles() 메서드와 File클래스의 파일생성 메서드인 mkdir()를 활용하면 쉽게 파일을 복사하실 수 있습니다.
자바로 파일 복사하기
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copy{
public static void main(String[] args) {
File folder1 = new File("D:\\Eclipse\\Java\\복사할폴더\\복사될폴더");
File folder2 = new File("D:\\Eclipse\\Java\\복사된폴더");
File[] target_file = folder1.listFiles();
for (File file : target_file) {
File temp = new File(folder2.getAbsolutePath() + File.separator + file.getName());
if(file.isDirectory()){
temp.mkdir();
} else {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
fos = new FileOutputStream(temp) ;
byte[] b = new byte[4096];
int cnt = 0;
while((cnt=fis.read(b)) != -1){
fos.write(b, 0, cnt);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
fis.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
하지만 위와 같은 방법으로 단순하게 복사 대상의 정보만 읽어와서 디렉토리 복사를 진행할경우. 엄청난 결함이생깁니다. 복사대상 폴더 내부에 파일만 있을경우에는 문제가 없겠지만 폴더가 있고 그 폴더안에 파일이 또 있을경우에는 폴더 내부의 파일은 복사가 되지않고 껍데기만 복사가 됩니다.
이 문제를 해결하기 위해서는 복사 대상폴더의 내부 폴더를 일일이 들어가 재귀적으로 호출하여 가장 하위 디렉토리부터 파일을 복사해준뒤 한단계 한단계 상위폴더로 올라가는 작업을 해주어야합니다.
재귀함수를 활용하여 최하위 폴더부터 차례대로 복사하기
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copy {
public static void main(String[] args) {
File folder1 = new File("D:\\Eclipse\\Java\\복사할폴더\\복사될폴더");
File folder2 = new File("D:\\Eclipse\\Java\\복사된폴더");
Copy.copy(folder1, folder2);
}
public static void copy(File sourceF, File targetF){
File[] target_file = sourceF.listFiles();
for (File file : target_file) {
File temp = new File(targetF.getAbsolutePath() + File.separator + file.getName());
if(file.isDirectory()){
temp.mkdir();
copy(file, temp);
} else {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
fos = new FileOutputStream(temp) ;
byte[] b = new byte[4096];
int cnt = 0;
while((cnt=fis.read(b)) != -1){
fos.write(b, 0, cnt);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
fis.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
'Language > Java' 카테고리의 다른 글
[Java] 비트(Shift) 연산자 사용법 & 예제 (2) | 2020.04.19 |
---|---|
[Java] 자바로 폴더(디렉토리),파일 이동시키기 / 잘라내기 (1) | 2018.12.28 |
[Java] 자바로 폴더(디렉토리) 삭제하기(하위파일, 폴더 포함) (11) | 2018.12.26 |
[Java] 자바로 폴더(디렉토리) 생성하기 (0) | 2018.12.25 |