2017-05-21 18 views
0

Java NIO API에서 Buffer 클래스의 마킹 기능과 관련된 문제가 있습니다. Buffer 부모 클래스에서 마킹 기능을 상속받은 ByteBuffer를 사용하여 몇 가지 예제를 실행하려고합니다.Java NIO의 버퍼 마킹

달성하려는 예제는 "AwesomeSauce"를 출력으로 사용하고 "Sauce"다음에 마킹 기능을 사용하는 것입니다. 코드는 아래와 같다 :

다음
public class MarkingNIO { 

public static void main(String[] args) { 
    ByteBuffer buffer = ByteBuffer.allocate(20); 
    byte byteArray[]; 

    buffer.put("AwesomeSauce".getBytes()); 

    int prevPos = buffer.position(); 
    buffer.position(7).mark().position(prevPos); //Mark position 7 and revert back so that we can flip 
    buffer.flip(); 

    byteArray = new byte[buffer.limit() - buffer.position()]; 

    for (int i = 0; buffer.hasRemaining(); i++) { 
     byteArray[i] = buffer.get(); 
    } 

    System.out.println("Whole string: " + new String(byteArray)); 

    buffer.reset(); 

    byteArray = new byte[buffer.limit() - buffer.position()]; 

    for (int i = 0; buffer.hasRemaining(); i++) { 
     byteArray[i] = buffer.get(); 
    } 

    System.out.println("Partial String" + new String(byteArray)); 
} 
} 

내게 출력은 같이

AwesomeSauce 
Exception in thread "main" java.nio.InvalidMarkException 
    at java.nio.Buffer.reset(Buffer.java:306) 
    at markingnio.MarkingNIO.main(MarkingNIO.java:37) 
Java Result: 1 

리셋 방법에 에러 포인트.

편집 : 학습 목적으로 mark() 및 reset() 메소드를 테스트 해 보았습니다. 어느 쪽이든, 문제는 flip() 메서드가 "mark = -1"문을 갖고 position (int)이 "if (mark> position) mark = -1;"문을 가졌다는 것입니다. 이 광고에

+0

buffer.position(7);에 당신이 모든 합병증을 필요로하지 않는 변경 :

당신은 삭제할 수 있습니다. 단지'get (int index)'를 직접 사용하십시오. – EJP

+0

나는 이것을 학습 목적으로하고있다. –

답변

0

보면 :

buffer.flip(); 
public final Buffer flip() { 
    limit = position; 
    position = 0; 
    mark = -1; 
    return this; 
} 

이 호출이 설정된 것 마크 = -1 방법 및 리셋()의 구현을 참조 :

public final Buffer reset() { 
    int m = mark; 
    if (m < 0) 
     throw new InvalidMarkException(); 
    position = m; 
    return this; 
} 

마르크 동안 InvalidMarkException를 슬로우 리셋 = -1; buffer.position(7).mark().position(prevPos);buffer.reset();

+0

글쎄, 마킹 및 리셋 기능을 테스트하기 위해이 작업을 수행하고있었습니다. 어느 쪽이든 플립 방법에 표 = -1이 있음을 알지 못했기 때문에 귀하의 의견은 나를 도왔습니다. 고맙습니다! –

+0

시간이 지남에 따라 코드가 변경되므로 구현에 의존하는 것은 좋지 않습니다. 미래의 모든 Java 릴리스에서 안정적인 상태를 유지할 수있는 것은 [documentation] (https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#flip--)입니다. 상태 : "마크가 정의 된 경우 폐기됩니다." – VGR