자바에서는 입력과 출력이 각각 분리되어 별도로 작업을 하도록 설계되어 있다. 단 RandomAccessFile만큼은 하나의 클래스로 파일에 대한 입력과 출력을 모두 할 수 있도록 되어있다. 이러한 것이 가능한 이유는 해당 클래스가 InputStream과 OutputStream에서 상속받지 않고 DataInput과 DataOutput 인터페이스를 모두 구현했기 때문이다. 또한 DataInputStream과 DataOutputStream은 이러한 인터페이스를 구현한 것이기 때문에 해당 스트림들에서 쓰던 기본 자료형 읽고 쓰기가 RandomAccessFile 클래스에서도 사용할 수 있다.
해당 클래스의 가장 큰 장점은 파일의 어느 위치에나 읽기 쓰기가 가능하다는 것이다. 왜냐하면 다른 입출력 클래스들은 입출력 소스에 순차적으로 읽고 쓰기에 제한적이기 때문이다. 이러한 가능하게 하기 위해서는 내부적으로 파일 포인터를 사용한다. 포인터를 조작하여 특정한 위치에서 파일을 조작할 수 있는 것이다.
| RandomAccessFile(File file, String mode)
RandomAccessFile(String fileName, String mode) |
주어진 file에 읽기 또는 읽기와 쓰기를 하기 위한 인스턴스를 생성한다. mode에 값은 “r” ,“rw”,”rws”, “rwd”가 지정가능하다. “rws”와 “rwd”는 기본적으로 “rw”와 같지만 출력 내용이 파일에 지연 없이 바로 쓰이게 하며 여기서 d는 파일 내용만, s는 파일의 메타 정보도 포함한다. |
|---|---|
FileChannel getChannel() |
파일의 파일 채널을 반환한다. |
FileDescriptor getFD() |
파일의 파일 디스크립터를 반환한다. |
long getFilePointer() |
파일의 포인터 위치를 알려준다. |
long length() |
파일의 크기를 얻을 수 있다. |
void seek(long pos) |
파일 포인터의 위치를 변경한다. 위치는 파일의 첫 부분부터 pos만큼 떨어진 곳이다. |
void setLength(long newLength) |
파일의 크기를 지정된 길이로 변경한다. |
int skipBytes(int n) |
지정된 수만큼의 byte를 건너뛴다. |
import java.io.*;
class RandomAccessFileEx1{
public static void main(String[] args) {
try{
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());
raf.writeInt(100);
System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());
raf.writeInt(100L);
System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());
} catch(IOExeption e) {
e.printStactTrace();
}
}
}
//결과
//파일 포인터의 위치 : 0
//파일 포인터의 위치 : 4
//파일 포인터의 위치 : 12