프로그래밍 언어/JAVA

파일 입출력 응용: 파일 복사

· 코딩마이데이

파일은 문자열로 이루어진 텍스트 파일과 이미지나 오디오 혹은 그래픽 등 바이너리 코드로 이루어진 바이너리 파일로 나뉜다. 바이너리 파일은 바이트 스트림으로 읽고 써야 정확하게 복사가 이루어지지만, 텍스트 파일은 문자 스트림이나 바이트 스트림 중 어떤 것을 사용해도 복사에 문제가 없다.

 

텍스트 파일 복사

FileReader를 이용하여 텍스트 파일을 읽고 FileWriter로 텍스트 파일에 복사합니다. 파일 경로명은 File 객체를 이용합니다. 

텍스트 파일 복사

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TextCopyEx {
    public static void main(String[] args) {
        File  src = new File("c:\\windows\\system.ini"); // 원본 파일 경로명
        File dest = new File("c:\\Temp\\system.txt"); // 복사 파일 경로명
        
        int c;
        try {
            FileReader fr = new FileReader(src); // 파일 입력 문자 스트림 생성
            FileWriter fw = new FileWriter(dest); // 파일 출력 문자 스트림 생성
            while ((c = fr.read()) != -1) { // 문자 하나 읽고
                fw.write((char) c); // 문자 하나 읽고
            }
            fr.close();
            fw.close();
            System.out.println(src.getPath() + "를 " + dest.getPath() + "로 복사하였습니다.");
        } catch (IOException e) {
            System.out.println("파일 복사 오류");
        }
    }
}

 

실행 결과

c:\windows\system.ini를 c:\Temp\system.txt로 복사하였습니다.

 

바이너리 파일 복사

바이너리 파일 복사

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BinaryCopyEx {
    public static void main(String[] args) {
        File src = new File("c:\\Temp\\srcimg.jpg"); // 원본 파일 경로명
        File dest = new File("c:\\Temp\\copyimg.jpg"); // 복사 파일 경로명

        long start = System.currentTimeMillis(); // 현재 시간
        int c;
        try {
            FileInputStream fi = new FileInputStream(src); // 파일 입력 바이트 스트림 생성
            FileOutputStream fo = new FileOutputStream(dest); // 파일 출력 바이트 스트림 생성

            while ((c = fi.read()) != -1) {
                fo.write((byte) c);
            }
            fi.close();
            fo.close();
            long end = System.currentTimeMillis(); // 복사 완료 시간
            double seconds = (end - start) / 1000.0; // 복사에 걸린 시간(초 단위)
            System.out.println(src.getPath() + "를 " + dest.getPath() + "로 복사하였습니다.");
            System.out.println("복사 시간은 " + seconds + "초입니다.");
        } catch (IOException e) {
            System.out.println("파일 복사 오류");
        }
    }
}

 

실행 결과

c:\Temp\srcimg.jpg를 c:\Temp\copyimg.jpg로 복사하였습니다.
복사 시간은 0.158초입니다.

 

블록 단위로 파일 고속 복사

복사 속도를 높이라면 BufferedInputStream과 BufferedOutputStream을 사용하든지, 아니면 블록 단위로 읽고 쓰도록 수정하면 됩니다.

블록 단위로 바이너리 파일 고속 복사

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BlockBinaryCopyEx {
    public static void main(String[] args) {
        File src = new File("c:\\Temp\\srcimg.jpg"); // 원본 파일 경로명
        File dest = new File("c:\\Temp\\copyimg.jpg"); // 복사 파일

        long  start = System.currentTimeMillis(); // 현재 시간
        try {
            FileInputStream fi = new FileInputStream(src); // 파일 입력 바이트 스트림 생성
            FileOutputStream fo = new FileOutputStream(dest); // 파일 풀력 바이트 스트림 생성

            byte [] buf = new byte[1024 * 10]; // 10KB 버퍼
            while(true) {
                int n = fi.read(buf); // 버퍼 크기만큼 읽기, n은 실제 읽은 바이트
                fo.write(buf, 0, n); // buf[0]부터 n 바이트 쓰기
                if (n < buf.length)
                    break; // 버퍼 크기보다 작게 읽었기 때문에 파일 끝에 도달. 복사 종료
            }
            fi.close();
            fo.close();
            long end = System.currentTimeMillis(); // 복사 완료 시간
            double seconds = (end - start) / 1000.0; // 복사에 걸린 시간(초 단위)
            System.out.println(src.getPath() + "를 " + dest.getPath() + "로 복사하였습니다.");
            System.out.println("복사 시간은 " + seconds + "초입니다.");
        } catch (IOException e) {
            System.out.println("파일 복사 오류");
        }
    }
}

 

실행 결과

c:\Temp\srcimg.jpg를 c:\Temp\copyimg.jpg로 복사하였습니다.
복사 시간은 0.001초입니다.

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

자바 GUI 패키지  (1) 2025.05.14
자바의 GUI  (0) 2025.05.11
File 클래스  (1) 2025.05.05
버퍼 입출력과 파일 입출력  (1) 2025.05.02
FileInputStream을 이용한 바이너리 파일 읽기  (6) 2025.04.29