BE/Java

[Java] File I/O

baek-dev 2025. 3. 18. 18:27

1. File I/O란?

 

File I/O는 파일 입출력(File Input/Output) 의 줄임말임.

 

쉽게 말해 프로그램이 파일에서 데이터를 읽거나, 처리된 데이터를 파일로 저장하는 작업을 의미함.

Input(입력)

파일 → 프로그램 방향으로 데이터를 읽음.

Output(출력)

프로그램 → 파일 방향으로 데이터를 저장함.

 

즉, 파일에 데이터를 영구적으로 저장하거나 외부 데이터를 읽어오는 용도로 사용됨.

 

예를 들어, 메모장에 일기를 쓰는 행위는 Output이고, 작성된 일기를 나중에 읽어보는 행위는 Input임.

 


2. Java에서의 File I/O 처리 방법

 

Java에서는 파일 데이터를 처리할 때 크게 두 가지 스트림(Stream)을 제공함.

 

① 바이트 기반 스트림(Byte Stream)

데이터를 바이트(byte, 8비트) 단위로 처리함.

주로 이미지, 비디오, 오디오 등 이진 데이터를 다룰 때 사용함.

대표 클래스: InputStream, OutputStream

 

② 문자 기반 스트림(Character Stream)

데이터를 문자(character) 단위로 처리함.

주로 텍스트 파일을 읽거나 쓸 때 사용함.

대표 클래스: Reader, Writer

 


3. File I/O에서 자주 사용하는 클래스 정리

 

Java의 File I/O는 다음 클래스들을 주로 사용함.

구분 바이트(byte) 기반 문자(character) 기반
입력 FileInputStream FileReader
출력 FileOutputStream FileWriter
버퍼링(효율성 향상) BufferedInputStreamBufferedOutputStream BufferedReaderBufferedWriter

Buffered 클래스는 버퍼를 사용하여 데이터를 효율적으로 처리할 때 사용됨.

 


4. File I/O 예제 코드

 

📌 (1) 파일에 쓰기 (문자 기반, FileWriter + BufferedWriter)

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriteExample {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("example.txt"))) {
            bw.write("안녕하세요. 파일 쓰기 예제입니다.");
            bw.newLine();  // 줄바꿈 추가
            bw.write("두 번째 줄입니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedWriter는 버퍼를 사용해 효율적으로 데이터를 파일에 저장함.

try-with-resources로 자동으로 close() 처리됨.

 


📌 (2) 파일에서 읽기 (문자 기반, FileReader + BufferedReader)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedReader를 사용하면 텍스트 파일의 데이터를 효율적으로 읽어올 수 있음.

 


📌 (3) 바이트 기반 파일 복사 (이미지 파일 예제)

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

public class FileCopyExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("source.jpg");
             FileOutputStream fos = new FileOutputStream("copy.jpg")) {

            byte[] buffer = new byte[1024];
            int length;

            while ((length = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, length);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이미지, 오디오 등 이진 데이터를 정확히 복사할 때 바이트 기반 스트림을 사용함.

 


5. Java NIO(New I/O)의 사용법 (Java 7 이상)

 

Java 7부터는 보다 간단하고 효율적인 파일 입출력을 위해 NIO API를 제공하고 있음.

 

📌 NIO를 활용한 파일 쓰기

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.io.IOException;

public class NIOWriteExample {
    public static void main(String[] args) {
        String data = "Java NIO를 이용한 파일 쓰기 예제입니다.\n두 번째 줄입니다.";
        try {
            Files.write(Paths.get("nio-example.txt"), data.getBytes(), StandardOpenOption.CREATE);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 


📌 NIO를 활용한 파일 읽기

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class NIOReadExample {
    public static void main(String[] args) {
        try {
            List<String> lines = Files.readAllLines(Paths.get("nio-example.txt"));
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 


6. File I/O 사용 시 주의사항 및 팁

파일 작업 후에는 항상 close() 메서드를 호출해야 함. 이를 편하게 하기 위해 try-with-resources를 사용하는 게 좋음.

데이터가 클수록 Buffered 클래스를 사용하면 성능 향상이 크게 됨.

텍스트 데이터는 문자 기반 클래스(Reader, Writer), 이미지나 오디오 같은 이진 데이터는 바이트 기반 클래스(InputStream, OutputStream)를 선택하면 좋음.

성능 및 효율성을 높이려면 Java NIO API를 적극 활용하는 걸 추천함.

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 비동기 처리 (try-catch)  (0) 2025.03.28
[Java] 체인호출  (0) 2025.03.24
[Java] BufferedReader  (0) 2025.03.17
[Java] StringTokenizer  (0) 2025.03.16
[Java] 네이버 포매터(Naver Formatter)  (0) 2025.03.11