JavaTM Platform
Standard Ed. 6

java.nio
클래스 Buffer

java.lang.Object 
  상위를 확장 java.nio.Buffer
직계의 기존의 서브 클래스:
ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer , ShortBuffer


public abstract class Buffer
extends Object

특정의 원시형 데이터의 컨테이너입니다.

버퍼는, 특정의 원시형 요소의 리니어로 유한의 순서입니다. 컨텐츠 외에, 용량, 리밋트, 위치라고 하는 필수 프로퍼티이 있습니다.

「용량」은, 그 버퍼에 포함되는 요소수에 의해 결정됩니다. 용량의 값은 고정으로, 반드시 정의 값이 됩니다.

「리밋트」는, 읽어들여 또는 기입을 행해서는 안 되는 최초의 요소의 인덱스입니다. 용량 이하의 정의 값이 됩니다.

「위치」는, 다음에 읽어들여 또는 기입을 실시하는 요소의 인덱스입니다. 리밋트 이하의 정의 값이 됩니다.

비불형의 원시형에는, 이 클래스의 서브 클래스가 1 개씩 할당할 수 있고 있습니다.

데이터의 전송

이 클래스의 서브 클래스는, 각각 다음의 2 개의 카테고리에 해당하는 「get」 및 「put」를 정의합니다.

「상대」조작. 현재 위치로부터 1 개 이상의 요소의 읽어들여 또는 기입을 실시해, 전송 된 요소의 수만큼 위치를 증가합니다. 요구된 전송이 리밋트를 넘는 경우, 상대 「get」는 BufferUnderflowException 를, 상대 「put」는 BufferOverflowException 를 throw 합니다. 어느 쪽의 경우도, 데이터는 일절 전송 되지 않습니다.

「절대」조작. 명시적인 요소 인덱스를 사용하기 위해(때문에), 위치는 변화하지 않습니다. 인덱스 인수가 리밋트를 넘는 경우, 절대 「get」, 절대 「put」라고도에 IndexOutOfBoundsException 를 throw 합니다.

적절한 채널의 입출력 조작을 실시하면, 데이터의 전송 (버퍼와의 주고받아)은 가능합니다. 이 조작은, 항상 현재 위치에 대해서 상대적으로 행해집니다.

마크와 리셋

버퍼의 「마크」는,reset 메소드를 실행했을 때에 돌아오는 위치를 지정하는 인덱스입니다. 정의되어 있지 않은 경우도 있습니다만, 정의되고 있는 경우는 반드시 위치 이하의 정의 값이 됩니다. 위치나 리밋트의 값이 마크의 값보다 작은 경우, 마크는 파기됩니다. 마크가 정의되어 있지 않은 상태로 reset 메소드를 호출하면(자),InvalidMarkException 가 throw 됩니다.

인 변형 (불변식)

다음의 인 변형은, 마크, 위치, 리밋트, 용량의 값을 나타냅니다.

0 <= mark <= position <= limit <= capacity

새롭게 작성된 버퍼의 위치는 항상 0, 마크는 미정도리입니다. 리밋트의 초기치는 0 인가, 버퍼의 구축 방법이나 종류에 따라서는 그 이외의 값이 됩니다. 일반적으로, 버퍼의 초기 컨텐츠는 미정도리입니다.

클리어, 플립, 되감기

위치, 리밋트, 용량의 값에 액세스 하는 메소드나, 마크나 리셋를 실시하는 메소드와 같게, 이 클래스도 버퍼에 대한 다음과 같은 조작을 정의합니다.

read 전용 버퍼

모든 버퍼는 읽어들여 가능합니다만, 기입도 가능하다라고는 한정하지 않습니다. 각 버퍼 클래스의 변이 메소드는 「생략 가능한 조작」으로 지정되고 있어 읽기 전용 버퍼상에서 불려 가면(자) ReadOnlyBufferException 를 throw 합니다. 읽기 전용 버퍼의 컨텐츠는 변경할 수 없습니다. 그러나, 마크, 위치, 리밋트의 값은 변경 가능합니다. 버퍼가 읽어내 전용일지 어떨지는,isReadOnly 메소드를 호출하는 것으로 판단할 수 있습니다.

thread의 안전성

버퍼는, 복수의 병행 thread에 의한 사용에 대해 안전하지는 않습니다. 복수의 thread로 사용하는 경우는, 적절한 동기 처리에 의해 버퍼에의 액세스를 제어할 필요가 있습니다.

호출의 연쇄

이 클래스의 메소드중 반환값을 돌려주지 않는 것은, 자신을 호출한 버퍼의 정보를 돌려줍니다. 이것을 응용해, 메소드 호출을 연쇄시킬 수가 있습니다. 예를 들어 다음과 같은 문장이 있다고 합시다.

 b.flip();
 b.position(23);
 b.limit(42);
이것들은, 보다 컴팩트한 형식의 일행으로 옮겨놓을 수 있습니다.
 b.flip(). position(23). limit(42);

도입된 버젼:
1.4

메소드의 개요
abstract  Object array ()
          현재의 버퍼를 보조하는 배열을 돌려줍니다 (옵션).
abstract  int arrayOffset ()
          현재의 버퍼의 보조 배열내에 있는, 이 버퍼의 최초의 요소의 오프셋(offset)를 돌려줍니다 (옵션).
 int capacity ()
          이 버퍼의 용량을 돌려줍니다.
 Buffer clear ()
          이 버퍼를 클리어 합니다.
 Buffer flip ()
          이 버퍼를 플립 (반전) 합니다.
abstract  boolean hasArray ()
          현재의 버퍼가 액세스 가능한 배열에 연동할지 어떨지를 판단합니다.
 boolean hasRemaining ()
          현재 위치로부터 리밋트까지 요소가 1 개에서도 존재할지 어떨지를 판단합니다.
abstract  boolean isDirect ()
          이 버퍼가다이렉트 버퍼일지 어떨지를 판단합니다.
abstract  boolean isReadOnly ()
          이 버퍼가 읽어내 전용일지 어떨지를 판단합니다.
 int limit ()
          이 버퍼의 리밋트를 돌려줍니다.
 Buffer limit (int newLimit)
          이 버퍼의 리밋트를 설정합니다.
 Buffer mark ()
          이 버퍼의 현재 위치에 마크를 설정합니다.
 int position ()
          이 버퍼의 위치를 돌려줍니다.
 Buffer position (int newPosition)
          이 버퍼의 위치를 설정합니다.
 int remaining ()
          현재 위치로부터 리밋트까지 존재하는 요소의 수를 돌려줍니다.
 Buffer reset ()
          버퍼의 위치를 이전에 마크 한 위치에 되돌립니다.
 Buffer rewind ()
          이 버퍼를 되감기 (되감아) 합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

메소드의 상세

capacity

public final int capacity()
이 버퍼의 용량을 돌려줍니다.

반환값:
이 버퍼의 용량

position

public final int position()
이 버퍼의 위치를 돌려줍니다.

반환값:
이 버퍼의 위치

position

public final Buffer  position(int newPosition)
이 버퍼의 위치를 설정합니다. 새로운 위치의 값보다 마크의 값 쪽이 큰 경우, 마크의 정의는 파기됩니다.

파라미터:
newPosition - 새로운 위치의 값은, 현재의 리밋트 이하의 부가 아닌 값이 아니면 안된다
반환값:
현재의 버퍼
예외:
IllegalArgumentException - newPosition 의 전제 조건이 채워지지 않은 경우

limit

public final int limit()
이 버퍼의 리밋트를 돌려줍니다.

반환값:
이 버퍼의 리밋트

limit

public final Buffer  limit(int newLimit)
이 버퍼의 리밋트를 설정합니다. 위치의 값이 새로운 리밋트보다 큰 경우, 리밋트와 같은 값으로 변경됩니다. 마크의 값이 새로운 리밋트보다 큰 경우, 마크의 정의는 파기됩니다.

파라미터:
newLimit - 새로운 리밋트치는, 이 버퍼의 용량 이하의 부가 아닌 값이 아니면 안된다
반환값:
현재의 버퍼
예외:
IllegalArgumentException - newLimit 의 전제 조건이 채워지지 않은 경우

mark

public final Buffer  mark()
이 버퍼의 현재 위치에 마크를 설정합니다.

반환값:
현재의 버퍼

reset

public final Buffer  reset()
버퍼의 위치를 이전에 마크 한 위치에 되돌립니다.

이 메소드를 호출해도, 마크의 값은 변경되지 않습니다. 마크가 파기되는 일도 없습니다.

반환값:
현재의 버퍼
예외:
InvalidMarkException - 마크가 설정되어 있지 않은 경우

clear

public final Buffer  clear()
이 버퍼를 클리어 합니다. 버퍼의 위치는 0, 리밋트는 용량의 값으로 설정됩니다. 마크는 파기됩니다.

일련의 채널 read 조작 또는 「put」조작을 사용해 이 버퍼에 데이터를 포함하기 전에, 이 메소드를 호출합니다. 다음에 예를 나타냅니다.

 buf.clear();     // Prepare buffer for reading
 in.read(buf);    // Read data

이 메소드는 버퍼내의 데이터를 실제로 소거하는 것은 아닙니다. 그러나, 그러한 상황으로 사용되기 (위해)때문에, 클리어 (clear)라고 명명해지고 있습니다.

반환값:
현재의 버퍼

flip

public final Buffer  flip()
이 버퍼를 플립 (반전) 합니다. 리밋트는 현재 위치의 값으로 설정되어 현재 위치를 나타내는 값은 0 으로 설정됩니다. 마크가 정의되고 있는 경우, 그 마크는 파기됩니다.

채널 read 조작 (put)뒤, 이 메소드를 호출해 채널 기입 조작 (상대 「get」)의 준비를 실시합니다. 다음에 예를 나타냅니다.

 buf.put(magic);    // Prepend header
 in.read(buf);      // Read data into rest of buffer
 buf.flip();        // Flip buffer
 out.write(buf);    // Write header + data to channel

어느 장소로부터 다른 장소에 데이터를 전송 할 때, 이 메소드를 compact 메소드와 조합해 사용하는 일이 있습니다.

반환값:
현재의 버퍼

rewind

public final Buffer  rewind()
이 버퍼를 되감기 (되감아) 합니다. 위치는 0 으로 설정되어 마크는 파기됩니다.

이 메소드는, 리밋트를 올바르게 설정한 뒤, 채널 기입 조작 (get)전에 호출합니다. 다음에 예를 나타냅니다.

 out.write(buf);    // Write remaining data
 buf.rewind();      // Rewind buffer
 buf.get(array);    // Copy data into array

반환값:
현재의 버퍼

remaining

public final int remaining()
현재 위치로부터 리밋트까지 존재하는 요소의 수를 돌려줍니다.

반환값:
이 버퍼내에 남아 있는 요소수

hasRemaining

public final boolean hasRemaining()
현재 위치로부터 리밋트까지 요소가 1 개에서도 존재할지 어떨지를 판단합니다.

반환값:
이 버퍼내에 요소가 1 개 이상 존재하는 경우에 한해 true

isReadOnly

public abstract boolean isReadOnly()
이 버퍼가 읽어내 전용일지 어떨지를 판단합니다.

반환값:
이 버퍼가 읽어들여 전용인 경우에 한해 true

hasArray

public abstract boolean hasArray()
현재의 버퍼가 액세스 가능한 배열에 연동할지 어떨지를 판단합니다.

이 메소드의 반환값이 true 이면,array 메소드 및 arrayOffset 메소드를 안전하게 호출할 수가 있습니다.

반환값:
현재의 버퍼가 배열에 연동하고 있어, read 전용이 아닌 경우에 한해 true
도입된 버젼:
1.6

array

public abstract Object  array()
현재의 버퍼를 보조하는 배열을 돌려줍니다 (옵션).

이 메소드는, 배열을 이용하는 버퍼를 native code에 의해 효율적으로 건네주기 위해서(때문에) 사용합니다. 구상 서브 클래스는, 이 메소드의 반환값으로서보다 강하고 형지를 무늬를 박아서 염색한 것 된 값을 돌려줍니다.

현재의 버퍼의 컨텐츠로 변경을 더하면(자), 반환되는 배열의 컨텐츠도 변경됩니다. 그 역도 같습니다.

이 메소드를 호출하기 전에 hasArray 메소드를 호출해, 현재의 버퍼가 액세스 가능한 보조 배열을 가지고 있는 것을 확인합니다.

반환값:
현재의 버퍼를 보조하는 배열
예외:
ReadOnlyBufferException - 현재의 버퍼가 배열에 연동하고 있어, 게다가 읽어들여 전용인 경우
UnsupportedOperationException - 현재의 버퍼가 액세스 가능한 배열을 이용하지 않는 경우
도입된 버젼:
1.6

arrayOffset

public abstract int arrayOffset()
현재의 버퍼의 보조 배열내에 있는, 이 버퍼의 최초의 요소의 오프셋(offset)를 돌려줍니다 (옵션).

현재의 버퍼가 배열에 연동하고 있으면, 그 위치 p 가 배열의 인덱스 p + arrayOffset() 와 일치합니다.

이 메소드를 호출하기 전에 hasArray 메소드를 호출해, 현재의 버퍼가 액세스 가능한 보조 배열을 가지고 있는 것을 확인합니다.

반환값:
현재의 버퍼의 배열내에 있는, 이 버퍼의 최초의 요소의 오프셋(offset)
예외:
ReadOnlyBufferException - 현재의 버퍼가 배열에 연동하고 있어, 게다가 읽어들여 전용인 경우
UnsupportedOperationException - 현재의 버퍼가 액세스 가능한 배열을 이용하지 않는 경우
도입된 버젼:
1.6

isDirect

public abstract boolean isDirect()
이 버퍼가다이렉트 버퍼일지 어떨지를 판단합니다.

반환값:
현재의 버퍼가 다이렉트 버퍼인 경우에 한해 true
도입된 버젼:
1.6

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.