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 |