지난 글 : [프로그래밍 언어/JAVA] - JAVA 입문 - 직렬화
File 클래스
File 클래스는 파일이라는 개념을 추상화한 클래스다. 파일에 대한 입출력은 최근 글들에서 배운 스트림을 사용해 수행한다. 따라서 File 클래스에 별도의 입출력 기능은 없지만 파일 자체의 경로나 정보를 알 수 있고 파일을 생성할 수도 있다. File 클래스의 주요 생성자는 아래와 같다.
아래 코드를 보며 File 클래스에서 제공하는 여러 메서드 기능을 알아보자.
File 클래스를 생성한다해서 실제 파일이 생성되는 것이 아니라 createNewFile( ) 메서드를 활용해 파일을 생성한다. 그리고 File 클래스가 제공하는 메서드로 생성한 파일의 속성을 살펴볼 수 있다. 19행 delete( ) 메서드를 사용해 파일을 삭제한다. 이렇게 생성한 파일은 FileInputStream과 같은 파일 입출력 기능을 제공하는 클래스의 생성자 매개변수로 사용할 수 있다.
RandomAccessFile 클래스
RandomAccessFile은 입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 있는 클래스다. 지금까지 배운 스트림은 처음부터 차례로 자료를 읽었지만 RandomAccessFile은 임의의 위치로 이동해 자료를 읽을 수 있다. RandomAccessFile에는 파일 포인터가 있는데, 현재 파일의 어느 위치에서 읽고 쓰는지 그 위치를 가리키는 속성이다. 스트림을 생성하지 않고 간단하게 파일에 자료를 쓰거나 읽을 때 사용하면 유용하다. 파일 포인터가 이동하는 위치가 파일 자료를 읽거나 쓰이는 위치이므로 파일 포인터의 위치를 잘 생각하며 구현해야 한다. RandomAccessFile의 생성자는 아래와 같다.
RandomAccessFile은 임의의 위치에 읽거나 쓰는 기능 외에 다양한 자료형 값을 읽거나 쓸 수 있다. RandomAccessFile 이 구현한 인터페이스는 DaraInput, DataOutput 인터페이스가 있다. 이런 인터페이스를 구현하면 RandomAccessFile 클래스는 DataInputStream 및 DataOutputStream과 같이 다양한 자료형을 다루는 메서드를 사용할 수 있다.
RandomAccessFile을 활용해 여러 자료형 값을 읽고 쓰는 코드를 보자.
출력 결과 밑의 오류는 파일 포인터의 위치가 맨 처음으로 옮겨지지 않아서 발생한 것이다. 파일에 자료를 읽거나 쓰면 파일 포인터가 이동한다. 처음 RandomAccessFile 클래스를 생성하면 파일 포인터는 가장 앞, 0의 위치를 가리킨다. int 값을 하나 쓰면 int는 4 바이트이므로 파일 포인터 위치가 4로 이동한다. 즉 다음 자료를 읽거나 써야 할 위치로 계속 이동하는 것이 파일 포인터다. RandomAccessFile을 생성할 때 rw 모드를 사용했다. 따라서 위 코드에서 생성한 파일로 읽고 쓰기를 모두 했다. 각 메서드가 호출됨으로 이동한 파일 포인터의 값은 아래와 같다.
rf.writeInt(100); //int 4 바이트
rf.writeDouble(3.14); //double 8 바이트
rf.writeUTF("안녕하세요"); //수정된 UTF-8 사용 한글(3 바이트) * 5 + null 문자(2 바이트) = 17
여기서 read( ) 메서드를 바로 호출하면 오류가 난다. 이유는 우리가 읽어야 할 파일 위치는 맨 처음인 0인데, 파일 포인터의 위치는 29이기 때문이다. 따라서 파일 포인터 위치를 이동해 주는 seek( ) 메서드를 활용해 맨 처음으로 이동한다. 아래처럼 파일을 읽기 전에 파일 포인터를 이동하는 코드를 넣어 준다.
참고 서적 : 자바 프로그래밍 입문 - 박은종
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA 입문 - 학점 산출 프로그램 만들기 (0) | 2022.06.21 |
---|---|
JAVA 입문 - 직렬화 (0) | 2022.06.19 |
JAVA 입문 - 보조 스트림 (0) | 2022.06.18 |
JAVA 입문 - 문자 단위 스트림 (0) | 2022.06.16 |
JAVA 입문 - 바이트 단위 스트림 (0) | 2022.06.15 |