chapter 7. 랜덤 액서스 파일
임의 접근 파일 특성
- 유연하고 데이타가 있는 위치로 빨리 이동할 수 있다
- 파일의 시작과 끝에 데이터를 추가 가능
- 특정 단위로 정보를 읽을 수 있음(문자, 바이트 덩어리)
- 특정 위치를 교체 ,줄을 합치거나 , 삭제가능
- SeekableByteChannel과 관련됨. (NIO.2)
7.1 ByteBuffer 소개
NIO의 버퍼의 중요한 구성 요소(2가지) : 속성, 선조 메소드
ByteBuffer 의 필수 속성
- Limit : 쓸 때 - 얼마나 많은 데이터를 가질 수 있는지 가르킨다, 읽을때 - 테이터를 넣을 수 있는 방이 얼마나 많이 남았는지를 가르킨다.
- Position : 얼마나 많은 데이터를 읽고 쓰는지 추적한다. (position <= limit)
- Capacity : 버퍼에 저장할 수 있는 데이터의 최대 크기 (limit <= capacity)
- mark : reset() 메소드가 호출될 때 위치를 표시 한다. (만약 mark가 설정되지 않았는데 호출하면 InvalidMarkException 발생한다.)
0 <= mark <= position <= limit <= capacity
ByteBuffer 의 선조 메소드
- flip() : 읽기 / 쓰기 변경하고 싶을 때 -> (책이 이상하다. 나중에 다시 정리 필요)
- rewind() : 버퍼를 되감아 싶거나 정리하고 싶을 때
- clear() : 버퍼를 정리 한다.(데이터를 삭제하지 않는다.)
- get() :
- put() :
- allocateDirect() :
- allocate() :
7.2 채널 소개
채널과 스트림의 차이점
- 스트림이 단방향이라고 채널은 읽기와 쓰기 함께 지원한다.
- 비동기를 지원한다.
- 버퍼를 반드시 이용하여 읽기 쓰기를 한다.
7.3 SeekableByteChannel을 사용해 파일에 임의 접근하기
채널에 위치라는 개념을 구현하여 RAF를 지원한다.
임의 접근을 위한 주요 메서드
- position() : 채널의 현재 위치를 반환한다.(음이 아닌 정수)
- position(long) : 채널의 위치를 long 값으로 지정한다. 현재 크기보다 큰 값을 위치로 설정할 수 있지만, 엔티티의 크기를 변경되지 않는다.
- truncate(long) : long 값의 채널에 연결된 엔티티를 잘라낸다.
- read(ByteBuffer) : 바이트를 채널에서 버퍼로 읽어 들인다.
- write(ByteBuffer) : 바이트를 채널에서 버퍼로 쓴다.
- size() : 이 채널이 연결된 엔티티의 현재 크기를 반환한다.
7.4 FileChannel로 작업하기
파일채널은 파일의 특정 영역을 잠글수 있고 또한 고속 접근을 위해서 파일의 특정 영역을 메모리에 직접 연결할 수있다.
7.4.1 파일의 영역을 메모리에 직접 매핑
관련 메소드인 FileChannel.map()의 세 가지 인자 설명
- mode : 모드 정의 , 세 가지 모드
- MapMode.READ_ONLY - 읽기전용 (다른 작업을 수행시 예외 ReadOnlyBufferException 발생)
- MapMode.READ_WRITE - 읽고/쓰기 (버퍼의 변경 사항이 파일에 반영되며 다른 프로그램에서 확인 할 수 있음)
- MapMode.PRIVATE - 쓰기 시 복사 매핑, 버퍼의 변경 사항이 파일에 반영되지 않는다. 다른 프로그램에서 변경 사항을 확인 할 수 없음.
- position : 매핑된 영역은 파일 안에서 지정된 위치에서 시작한다.
- size : 매핑된 영역의 크기 ( 0 <= size <= Integer.MAX_VALUE)
MappedByteBuffer 확장 메서드(3가지)
- force() : 버퍼의 변경 사항을 원본 파일에 강제 반영
- load() : 버퍼의 내용을 물리 메모리로 로드
- isLoad() : 버퍼 내용이 물리 메모리에 있는지 확인
7.4.2 채널의 파일 잠그기
파일 잠금 - 두 명 이상의 사용자가 같은 파일을 동시에 수정하지 못하게 데이터의 일부분이나 파일에 접근하지 못하게 제한하는 메커니즘.
현재 OS 마다 방식 틀리다. 그리고 잠금 기능은 항상 예상대로 동작하지 않는다.
주의 사항
- 파일 잠금은 전체 자바 가상머신에 대해 잡힌다. 파일 잠금은 같은 가상머신 안에서 여러 쓰레드가 한 파일에 대한 접근을 제어하는 데는 적합하지 않다. 참고 문서
- 원도는 디렉토리나 다른 구조의 잠금을 처리해주며, 다른 프로세스가 파일을 열었다면 삭제, 이름 변경, 쓰기 작업이 실패한다. 따라서 시스템 잠금에 대해 자바 잠금을 만드는 것은 실패하게 된다.
- 리눅스 커널은 권고 잠금 메커니즘으로 관리한다. 또한 커널 레벨에서 강제 잠금을 강제로 수행할 수 있다. 따라서 자바 잠금은 사용할 때는 이런 점을 기억해두어야 한다.
관련 메소드
- lock() : 원하는 잠금을 가져올 때까지 애플리케이션을 차단?
- tryLock() : 애플리케이션을 차단하지 않으며 파일 잠겨 있다면 null을 반환하거나 예외를 던진다.
** 가장 빠른 파일 복사 방법은 Path 방식을 이용한 Files.copy()
댓글 없음:
댓글 쓰기