문제

바이트 버퍼에서 가능한 많은 바이트를 넣는 가장 효율적인 방법은 무엇입니까? bbuf_src 다른 바이트 버퍼로 bbuf_dest (그리고 얼마나 많은 바이트가 전송되었는지 알고 있습니까?)? 노력하고있어 bbuf_dest.put(bbuf_src) 그러나 그것은 bufferoverflowexception을 던지고 싶어하는 것 같습니다. 그리고 필요할 때 지금은 Sun에서 Javadocs를 얻을 수 없습니다. > :( 아르.


편집 : Darnit, @Richard의 접근 방식 (후원 배열에서 put () bbuf_src) BBUF_SRC가 해당 배열에 액세스 할 수 없으므로 준비된 버퍼 인 경우 작동하지 않습니다. 이 경우 무엇을 할 수 있습니까 ???

도움이 되었습니까?

해결책 2

좋아, 나는 @Richard의 답변을 조정했다 :

public static int transferAsMuchAsPossible(
                     ByteBuffer bbuf_dest, ByteBuffer bbuf_src)
{
  int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
  if (nTransfer > 0)
  {
    bbuf_dest.put(bbuf_src.array(), 
                  bbuf_src.arrayOffset()+bbuf_src.position(), 
                  nTransfer);
    bbuf_src.position(bbuf_src.position()+nTransfer);
  }
  return nTransfer;
}

그리고 그것이 작동하는지 확인하기위한 테스트 :

public static boolean transferTest()
{
    ByteBuffer bb1 = ByteBuffer.allocate(256);
    ByteBuffer bb2 = ByteBuffer.allocate(50);
    for (int i = 0; i < 100; ++i)
    {
        bb1.put((byte)i);
    }
    bb1.flip();
    bb1.position(5);
    ByteBuffer bb1a = bb1.slice();
    bb1a.position(2);
    // bb3 includes the 5-100 range
    bb2.put((byte)77);
    // something to see this works when bb2 isn't empty
    int n = transferAsMuchAsPossible(bb2, bb1a);
    boolean itWorked = (n == 49);

    if (bb1a.position() != 51)
        itWorked = false;
    if (bb2.position() != 50)
        itWorked = false;
    bb2.rewind();
    if (bb2.get() != 77)
        itWorked = false;
    for (int i = 0; i < 49; ++i)
    {
        if (bb2.get() != i+7)
        {
            itWorked = false;
            break;
        }
    }
    return itWorked;
}

다른 팁

당신이 발견 한 것처럼, 백업 배열을 얻는 것이 항상 작동하지는 않습니다 (읽기 전용 버퍼, 직접 버퍼 및 메모리 매핑 파일 버퍼에 실패합니다). 더 나은 대안은 소스 버퍼를 복제하고 전송하려는 데이터 양에 대한 새 한도를 설정하는 것입니다.

int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
// use a duplicated buffer so we don't disrupt the limit of the original buffer
ByteBuffer bbuf_tmp = bbuf_src.duplicate ();
bbuf_tmp.limit (bbuf_tmp.position() + maxTransfer);
bbuf_dest.put (bbuf_tmp);

// now discard the data we've copied from the original source (optional)
bbuf_src.position(bbuf_src.position() + maxTransfer);

BBUF_DEST가 충분히 크지 않기 때문에 BufferoverFlowException을 얻습니다.

bbuf_src에서 전송할 수있는 최대 바이트 수를 찾으려면 bbuf_dest.remaining ()을 사용해야합니다.

int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
bbuf_dest.put(bbuf_src.array(), 0, maxTransfer);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top