▶ RandomAceessFile 클래스
- 입력과 출력이 동시에 이뤄질 수 있다.
- 입출력 위치를 임의로 변경할 수 있다.
- 파일을 대상으로만 존재하는 스트림이다.
스트림이라는 표현에는 "한쪽 방향으로만 형성되는 데이터의 흐름" 이라는 의미가 담겨있다. 즉 스트림이라 부르기 위해서는 데이터의 입력 및 출력이 순차적이어야하고, 입력만 가능하거나 출력만 가능해야 한다. 그래서 엄밀히 말하면 RandomAccessFile 클래스는 스트림 클래스가 아니다. 대표적인 입력 메소드는 아래와 같다.
- public int read() throws IOException
- public int read(byte[] b, int off, int len) throws IOException
- public final int readInt() throws IOException
- public final double readDouble() throws IOException
RandomAccessFile 클래스는 바이트 단위, 그리고 자료형 단위의 데이터 입력이 가능하다. 뿐만 아니라, 다음의 메소드를 통해서 바이트 단위와 자료형 단위의 데이터 출력도 가능하다.
- public void write(int b) throws IOException
- public void write(byte[]b, int off, int len) throws IOException
- public final void writeInt(int v) throws IOException
- public final double readDouble() throws IOException
무엇보다도 다음의 메소드 호출을 통해서 현재의 입출력 위치를 확인하거나 변경할 수 있는 것이 RandomAccessFile 클래스의 가장 큰 특징이다.
- public long getFilePointer() throws IOException
- public void seek(long pos) throws IOException
RandomAccessFile의 인스턴스는 내부적으로 입출력의 위치를 계속해서 기록한다. 그런데 그 위치 정보는 getFilePointer 메소드의 호출을 통해서 확인이 가능하다. 반면 seek 메소드의 호출을 통해서 입출력의 위치도 변경할 수 도 있다.
생성자는 아래와 같다.
public RandomAccessfile(String name, String mode) throws FileNotFoundException
이 생성자의 첫 번째 인자를 통해서는 파일의 이름을 전다한다. 그리고 두 번째 인자를 통해서는 파일의 용도 정보를 전달한다(r, rw)
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomFileReadWrite {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
RandomAccessFile raf = new RandomAccessFile("data.bin", "rw");
System.out.println("Write.......");
System.out.printf("현재 입출력 위치 : %d 바이트 \n", raf.getFilePointer());
raf.writeInt(200);
raf.writeInt(500);
System.out.printf("현재 입출력 위치 : %d 바이트\n", raf.getFilePointer());
raf.writeDouble(48.65);
raf.writeDouble(52.24);
System.out.printf("현재 입출력 위치 : %d 바이트\n", raf.getFilePointer());
System.out.println("Read........");
raf.seek(0); // 맨앞으로 이동
System.out.printf("현재 입출력 위치 : %d 바이트\n", raf.getFilePointer());
System.out.println(raf.readInt());
System.out.println(raf.readInt());
System.out.printf("현재 입출력 위치 : %d 바이트\n", raf.getFilePointer());
System.out.println(raf.readDouble());
System.out.println(raf.readDouble());
System.out.printf("현재 입출력 위치 : %d 바이트\n", raf.getFilePointer());
raf.close();
}
}
[결과]
Write.......
현재 입출력 위치 : 0 바이트
현재 입출력 위치 : 8 바이트
현재 입출력 위치 : 24 바이트
Read........
현재 입출력 위치 : 0 바이트
200
500
현재 입출력 위치 : 8 바이트
48.65
52.24
현재 입출력 위치 : 24 바이트
[Java] 자바의 내부(nested) 클래스 (0) | 2012.10.07 |
---|---|
[Java]File 클래스 (0) | 2012.10.01 |
[Java] 직렬화 대상에서 제외 transient (0) | 2012.09.29 |
[Java]ObjectInputStream & ObjectOutputStream (0) | 2012.09.29 |
[Java]BufferedReader & BufferedWriter (0) | 2012.09.29 |
댓글 영역