개발/JAVA

Java 파일 입출력 처리 및 파일 복사 예제

예니03 2025. 1. 20. 10:12
반응형

안녕하세요! 오늘은 Java를 사용해 파일을 처리하는 방법에 대해 다뤄보겠습니다. 파일 처리란 디렉터리나 파일의 정보를 확인하거나, 파일을 생성하고 복사하는 작업을 포함합니다. 이를 통해 프로그램에서 파일과 상호작용하는 방법을 익힐 수 있습니다. 😊

이번 글에서는 파일 정보 출력, 디렉터리 생성, 파일 복사 세 가지 주요 작업을 다룰 예정입니다. 각 예제를 단계별로 설명해드리겠습니다.

 

1. 파일 정보 출력 및 디렉터리 생성

먼저, 파일의 정보 출력디렉터리 및 파일 생성을 알아보겠습니다. 이를 위해 File 클래스를 사용합니다.

코드 설명:

package com.javaex.io.bytestream;

import java.io.File;
import java.io.IOException;

public class FileClassEx {
    // 파일이 저장될 경로를 설정합니다.
    private static String rootPath = System.getProperty("user.dir") + "\\files";  // 현재 작업 디렉터리의 'files' 폴더

    public static void main(String[] args) {
        System.out.println("루트 경로 : " + rootPath);

        // 'files' 폴더에 대한 File 객체를 생성합니다.
        File f = new File(rootPath); 
        // 파일 또는 디렉터리의 존재 여부를 확인합니다.
        System.out.println(rootPath + ":" + (f.exists() ? "존재함" : "없음"));

        // 디렉터리의 정보 출력
        printFileInfo(f);

        // 새로운 디렉터리 생성
        File newDir = new File(rootPath + "\\subdir\\subdir2"); 
        if (!newDir.exists()) {  // 디렉터리가 없다면
            if (newDir.mkdirs()) {  // 디렉터리를 실제로 생성
                System.out.println(newDir + "을 생성했습니다.");
            }
        }

        // 디렉터리 생성 후 다시 정보 출력
        printFileInfo(f);

        // 새 파일 생성
        File newFile = new File(rootPath + "\\subdir\\myfile.txt");
        if (!newFile.exists()) {  // 파일이 없다면
            try {
                newFile.createNewFile();  // 새 파일을 실제로 생성
            } catch (IOException e) {
                System.err.println("파일을 만들지 못했어요.");
            }
        }

        // 최종적으로 디렉터리 및 파일 정보 출력
        printFileInfo(f);

        // 파일 삭제
        newFile.delete();  // 생성한 파일 삭제
    }

    // 파일 또는 디렉터리의 정보를 출력하는 메서드
    private static void printFileInfo(File f) {
        System.out.println("------------------");

        if (f.isDirectory()) {  // 파일이 디렉터리일 경우
            System.out.println("디렉터리: " + f.getName());  // 디렉터리 이름 출력

            // 디렉터리 내 파일 목록을 가져옵니다.
            File[] files = f.listFiles();

            // 각 파일 또는 디렉터리의 정보를 출력합니다.
            for (File file : files) {
                // 디렉터리 여부에 따라 'd' 또는 'f'를 출력합니다.
                System.out.print(file.isDirectory() ? "d " : "f ");
                // 읽기 권한, 쓰기 권한, 실행 권한을 확인하여 출력합니다.
                System.out.print(file.canRead() ? "r" : ".");
                System.out.print(file.canWrite() ? "w" : ".");
                System.out.print(file.canExecute() ? "x" : ".");
                System.out.print(" " + file.getName());  // 파일명 출력
                System.out.println("\t" + file.length());  // 파일 크기 출력
            }
        } else {  // 파일일 경우
            System.out.println("File: ");
            System.out.println(f.getName() + "\t");
            System.out.println(f.canRead() ? "r" : ".");
            System.out.println(f.canWrite() ? "w" : ".");
            System.out.println(f.canExecute() ? "X" : ".");
            System.out.println();
        }
    }
}

코드 분석:

  1. File 객체 생성:
    File 객체는 실제로 파일이나 디렉터리를 생성하는 것이 아니라, 파일이나 디렉터리에 대한 정보를 다룰 수 있는 객체입니다. new File(rootPath)와 같이 파일이나 디렉터리 경로를 지정하여 객체를 생성합니다.
  2. 파일/디렉터리 존재 여부 확인:
    exists() 메서드를 사용하여 해당 경로에 파일이나 디렉터리가 존재하는지 확인할 수 있습니다.
  3. 디렉터리 생성:
    mkdirs() 메서드를 사용하여 여러 개의 중첩된 디렉터리를 한 번에 생성할 수 있습니다.
  4. 파일 생성:
    createNewFile() 메서드는 지정한 경로에 파일을 실제로 생성합니다. 단, 파일이 이미 존재하면 새로 생성되지 않습니다.
  5. 파일/디렉터리 정보 출력:
    listFiles() 메서드를 사용하여 디렉터리 내의 파일 목록을 배열로 가져오고, 파일의 권한(읽기, 쓰기, 실행)을 확인하여 출력합니다.

 

2. 파일 복사하기

이번에는 파일을 복사하는 작업을 해보겠습니다. FileInputStreamFileOutputStream을 사용하여 파일을 바이트 단위로 읽고, 읽은 내용을 새 파일에 쓰는 방식입니다.

코드 설명:

package com.javaex.io.bytestream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileStreamEx {
    private static String rootPath = System.getProperty("user.dir")+ "\\files\\";
    private static String source = rootPath + "img.jpg";  // 원본 파일 경로
    private static String target = rootPath + "img_copy.jpg";  // 복사할 파일 경로

    public static void main(String[] args) {
        System.out.println("rootPath : " + rootPath);
        System.out.println("원본 파일 : " + source);
        System.out.println("타겟 파일 : " + target);

        try (InputStream fis = new FileInputStream(source);  // 원본 파일을 읽기 위한 스트림
             OutputStream fos = new FileOutputStream(target)) {  // 복사할 파일을 쓰기 위한 스트림
             
            int data = 0;
            
            while((data = fis.read()) != -1) {  // 파일을 끝까지 읽음
                fos.write(data);  // 읽은 데이터를 타겟 파일에 씁니다.
                System.out.println("data : " + data);  // 복사된 데이터 출력
            }
            
            System.out.println("파일을 복사했어요.");
        } catch (FileNotFoundException e) {
            System.err.println("파일을 찾을 수 없습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

코드 분석:

  1. 파일 읽기/쓰기 스트림:
    FileInputStream은 파일을 읽는 스트림이고, FileOutputStream은 파일을 쓰는 스트림입니다. 두 스트림을 사용하여 파일을 바이트 단위로 처리할 수 있습니다.
  2. 파일 복사:
    fis.read()로 파일을 읽고, 읽은 데이터를 fos.write()로 새로운 파일에 씁니다. 파일을 한 바이트씩 읽어서 바로 복사하는 방식입니다.
  3. 예외 처리:
    파일이 존재하지 않을 경우 FileNotFoundException, I/O 오류가 발생할 경우 IOException을 처리합니다.
  4. 파일 복사 완료:
    파일 복사가 완료되면 "파일을 복사했어요." 메시지를 출력합니다.

 

마무리

오늘은 파일 정보 출력, 디렉터리 생성, 파일 복사 방법에 대해 배워보았습니다. Java에서 파일 처리 작업은 다양한 경우에 필요하며, 그 과정에서 File, FileInputStream, FileOutputStream 클래스들을 잘 활용할 수 있습니다.

  • 파일 및 디렉터리 정보 확인: File 클래스를 사용하여 파일이나 디렉터리의 정보를 쉽게 확인할 수 있습니다.
  • 디렉터리 및 파일 생성: 새로운 디렉터리와 파일을 프로그램 내에서 동적으로 생성할 수 있습니다.
  • 파일 복사: FileInputStream과 FileOutputStream을 사용하여 파일을 쉽게 복사할 수 있습니다.
반응형