2014-06-23 5 views
2

리틀 엔디안 순서로 정수를 써야합니다. 그래서 FileChannel 속성과 몇 가지 쓰기 메소드를 사용하여 클래스를 만들었습니다 (이 클래스는 아무 것도 확장하지 않습니다).FileChannel은 아무 것도 쓰지 않습니다.

하지만 문제가 있습니다. 한 가지 방법 만 작동하며 다른 것은 작동하지 않습니다! 여기

는 작업 방식 (DIS 인되는 FileChannel) :

public void writeBuffer(ByteArrayOutputStream t) throws IOException 
{ 
    ByteBuffer buffer=ByteBuffer.wrap(t.toByteArray()); 
    dis.write(buffer); 
} 

그리고이 작동하지 않는 쓰기 방법 중 하나입니다 : 내가 프로그램과 창피를 디버깅

public void writeInt(int t) throws IOException 
{ 
    ByteBuffer buffer=ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); 
    buffer.putInt(t); 
    dis.write(buffer); 
} 

.write (버퍼)는 0을 반환하므로 잘못된 것입니까?

누군가 리틀 엔디안에서 4 바이트 정수를 쓰는 다른 방법을 알고 있습니까?

+1

내가 올바르게 기억이 [버퍼를 플립] 필요 (http://stackoverflow.com/questions/14792968). 구아바에는 리틀 엔디 언 스트림이 있습니다. – McDowell

+0

없음, I는 디버거 및 검사 순서가 올바른지 –

+0

... [플립 (http://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#flip--) endianness에 영향을 미치지 않습니다. 버퍼를 쓰기에서 읽기로 전환합니다. – McDowell

답변

3

ByteBuffer를 만들 때 (예 : ByteBuffer.wrap 또는 ByteBuffer.allocate) 위치는 0으로 생성됩니다. 두 번째 방법에서는 putInt을 호출하여 ByteBuffer의 위치를 ​​4 (버퍼의 끝)로 이동하므로 ByteBuffer는 읽을 바이트가 더 이상 없다고보고합니다.

버퍼의 위치를 ​​재설정 다수의 방법이있다. 코멘트가 언급했듯이, flip은 버퍼에 데이터를 배치하고 다른 코드는 데이터를 읽기 시작 할 때 특별히 호출하도록 구성되어 있기 때문에, 아마 최선의 선택입니다.