본문 바로가기

강좌/JAVA I/O

JAVA I/O (자바입출력) - RandomAccessFile

원래 스트림(Stream)은 원칙적으로 순서대로 처리 된다.

하지만 예외적으로 접근처리를 할 수 있는것이 있다.

바로 RandomAccessFile이라는 것이다. 말 그대로 임의로 파일에 접근하는것이다.


자바 API를 보면 이 클래스는 Input이나 OutputStream같은 Stream으로 상속 받는게 아니고

바로 위의 클래스가 Object다.


메소드들 중 살펴볼 만한것은 seek메소드다. 레코드 바늘 처럼 원하는 곳을 찍어서 갈 수 있다.

무슨말이냐면 데이터 1,2,3,4,5,6을 Stream객체를 사용해서 쓰면 가져올때도 순차적으로 가져와야 하는데

RandomAccessFile을 쓰면 위치를 지정해서 꺼내올수 있다.


예제를 살펴보자.




우선 저장할 더블 배열 값을 선언한다.

RandomAccessFile 파라미터가 있는 생성자를 통해 초기 값(지정할 파일 경로와 옵션)을 넣어주고 객체를 생성한다.


그러면 일단 파일이 해당 경로에 생성이 될것이다.

그리고 난 후 for문을 통해서 데이터를 쓴다.


파일을 열어보면 double타입을 가지고 쓰여졌기때문에 깨져서 보인다..(오류가 아니다.)


제대로 값이 있나 확인을 위해서는 찍어보다.

seek(숫자); 메소드로 확인하자. seek메소드 안의 숫자는 절대 더블배열 자리값이 아니다. 바이트 자리 값이다.

예를 들어 double은 8바이트 이므로 0~7까지는 첫번째 double방 8~15까지는 두번째 방....이다.


그래서 seek(0)값은 2.3이다. seek(8)은 두번째 배열방 시작지점이니 3.2다


만약 계산이 그렇다면 seek(배열방*타입 바이트값)을 하면 바로 찾아갈 수 있다.


그렇다고 숫자값을 아무거나 집어 넣으면 생각지도 못한 값이 나온다. 잘못된 값은 아니겠지만..ㅎㅎ