java.io.File 클래스는 시스템의 파일이나 디렉토리를 Java 객체로 관리할 수 있게 해줍니다. 실제 데이터의 흐름을 다루기 전, 경로 설정 및 상태 확인을 담당하는 제어판 역할을 합니다.
File file = new File("path/to/file.txt");\, Linux /)가 다르므로 File.separator를 사용하는 것이 이식성 면에서 좋습니다.| 메서드 | 설명 |
|---|---|
exists() | 파일/디렉토리 존재 여부 확인 |
isFile() / isDirectory() | 파일인지 디렉토리인지 구분 |
mkdir() / mkdirs() | 디렉토리 생성 (후자는 상위 디렉토리까지 포함) |
delete() | 파일 또는 디렉토리 삭제 |
스트림은 데이터가 이동하는 통로입니다. 가장 큰 특징은 단방향이라는 점입니다. 즉, 입력과 출력을 동시에 할 수 없어 각각의 통로가 필요합니다.
InputStream, OutputStream 최상위 클래스.read(), write() 메서드는 바이트 단위로 작동합니다.Reader, Writer 최상위 클래스.보조 스트림은 실제 데이터를 주고받는 '노드 스트림'에 붙어서 부가 기능을 제공합니다. 스타벅스에서 커피(노드)에 휘핑크림(보조)을 얹는 것과 같습니다.
BufferedInputStream / BufferedReader: 버퍼를 사용하여 입출력 횟수를 줄여 성능을 대폭 향상합니다.InputStreamReader: 바이트 스트림을 문자 스트림으로 연결해주는 다리 역할을 합니다.DataInputStream / DataOutputStream: 기본 자료형(int, float 등) 단위로 데이터를 읽고 씁니다.직렬화는 메모리에 있는 객체 인스턴스를 바이트 형태로 변환하여 파일에 저장하거나 네트워크로 전송할 수 있게 만드는 과정입니다.
직렬화하려는 클래스는 반드시 Serializable을 구현해야 합니다. 이는 메서드가 없는 마커 인터페이스입니다.
public class User implements Serializable {
// 클래스의 버전 관리용 (역직렬화 시 검증)
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 직렬화에서 제외하고 싶은 필드
private transient String password;
}
이 부분은 혼동하기 쉬운 중요한 포인트입니다. 메모리 구조와 연관 지어 이해해야 합니다.
InvalidClassException이 발생하며 프로그램이 멈춥니다.Tip: 데이터 유실을 막으려면 상속 계층의 최상단 클래스에서 직렬화를 고려하거나, 부모 필드를 수동으로 처리하는
readObject,writeObject를 구현해야 합니다.