2017-10-19 2 views
0

offset (position)을 사용하여 바이트 버퍼의 내용을 파일에 쓰려고합니다. 내가 입력 스트림로 변환 할 때 그것은 작동,하지만 나는 새의 ByteBuffer에 포장 할 때오프셋을 사용하는 새로운 인스턴스에서 java.nio.ByteBuffer를 래핑하면 바이트가 손실됩니다.

이 작동 :

new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

이 구체적

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

을하지 않는, 내가 말할 때 버퍼의 내용을 파일에 쓰면 작동하지 않습니다 :

Files.write(path, ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()).array())

바이트 10 개

결과는 파일에 기록하지만이 완료되지 않았습니다, 그래서 JPEG는 볼 수 없습니다,하지만 난이 InputStream에 포장, 같은 버퍼를 작성하는 경우,이 작업을 수행합니다

val in = new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 
Iterator.continually (in.read).takeWhile (-1 != _).foreach (fileOutputStream.write) 

그래서 내가이어야합니다 어리석은 짓을하고 아마도 ByteBuffer가 어떻게 작동하는지 이해할 수 없습니다.

답변

1

ByteBuffer.wrap(byteBuffer.array(), <ANYTHING>, <ANYTHING>).array()은 단지 byteBuffer.array()을 의미하며 <ANYTHING>은 고려하지 않았습니다. 또한

, 전체

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

왜 당신은 단지 byteBuffer 자체를 사용하는 대신 그것을해야합니까, 단지 byteBuffer의 단순 복사본을 생성하는 번거로운 방법이 있나요? 당신이 원하는 것은

try (FileChannel outCh = new FileOutputStream(filename).getChannel()) { 
    outCh.write(byteBuffer); 
} 
+0

귀하의 제안 작품 같은 것이있다하지만 난 여전히 바이트 배열을 Files.write, 같은과 함께 작동하도록하는 방법을 궁금처럼

보인다. 내가 일하고있는 일부 apis는 단지 바이트 배열을 가져 간다. – Andrew

+0

배열의 올바른 부분을 수동으로 복사해야한다. 여기 https://stackoverflow.com/a/679325/2369544. 또한 ByteBuffer 뒤에있는 철학과 모순되는 제안은 최후의 수단으로 만 사용해야합니다 (https://stackoverflow.com/a/679335/2369544). – starikoff