본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 그 외 입출력 클래스

지난 글 : [프로그래밍 언어/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( ) 메서드를 활용해 맨 처음으로 이동한다. 아래처럼 파일을 읽기 전에 파일 포인터를 이동하는 코드를 넣어 준다.

출력 결과

 

참고 서적 : 자바 프로그래밍 입문 - 박은종