DataInputStream.skipBytes(n)는 언제 n 바이트를 건너뛸 수 없습니까?

StackOverflow https://stackoverflow.com/questions/51380

  •  09-06-2019
  •  | 
  •  

문제

그만큼 DataInput.skipBytes에 대한 Sun 설명서 "입력 스트림에서 n 바이트의 데이터를 건너뛰려고 시도하고 건너뛴 바이트를 삭제합니다.그러나 더 적은 수의 바이트(아마도 0)를 건너뛸 수 있습니다.이는 다양한 조건으로 인해 발생할 수 있습니다.n 바이트를 건너뛰기 전에 파일 끝에 도달하는 것은 가능성 중 하나일 뿐입니다."

  1. 파일 끝에 도달하는 것 외에 왜 그럴 수 있습니까? skipBytes() 올바른 바이트 수를 건너뛰지 않았나요?(그만큼 DataInputStream 내가 사용하고 있는 것은 다음 중 하나를 포장하는 것입니다. FileInputStream 또는 PipedInputStream.)

  2. 확실히 n 바이트를 건너뛰고 다음을 던지고 싶다면 EOFException 이로 인해 파일 끝으로 이동하게 되면 다음을 사용해야 합니다. readFully() 결과 바이트 배열을 무시하시겠습니까?아니면 더 좋은 방법이 있나요?

도움이 되었습니까?

해결책

1) 읽을 수 있는 데이터가 많지 않을 수도 있고(파이프의 다른 쪽 끝이 아직 그만큼의 데이터를 보내지 않았을 수도 있음), 구현 클래스가 비차단 클래스일 수도 있습니다(예:요청을 이행하기에 충분한 데이터를 기다리지 않고 가능한 만큼만 반환합니다.

그러나 실제로 이런 방식으로 동작하는 구현이 있는지는 모르겠지만 인터페이스는 이를 허용하도록 설계되었습니다.

또 다른 옵션은 단순히 파일을 읽는 도중에 닫히는 것입니다.

2) readFully()(항상 충분한 입력을 기다리거나 그렇지 않으면 실패함) 또는 루프에서 SkipBytes()를 호출합니다.나는 배열이 정말로 광대하지 않다면 전자가 아마도 더 나을 것이라고 생각합니다.

다른 팁

오늘이 문제를 발견했습니다.가상 머신에서 네트워크 연결을 읽는 중이었으므로 이러한 일이 발생하는 데에는 여러 가지 이유가 있을 수 있다고 생각합니다.나는 단순히 내가 원하는 바이트 수를 건너뛸 때까지 입력 스트림이 바이트를 건너뛰도록 강제하여 문제를 해결했습니다.

int byteOffsetX = someNumber; //n bytes to skip
int nSkipped = 0;

nSkipped = in.skipBytes(byteOffsetX);
while (nSkipped < byteOffsetX) {
    nSkipped = nSkipped + in.skipBytes(byteOffsetX - nSkipped);
}

Josh Bloch는 최근 이를 공개했습니다.InputStream.read가 가능한 한 많은 바이트를 읽도록 보장되지 않는다는 점에서 일관성이 있습니다.그러나 API 메소드로는 전혀 의미가 없습니다.InputStream에는 아마도 readFully도 있어야 합니다.

readFully()는 내가 참으려고 했던 것보다 더 많은 성능 오버헤드를 추가하는 것으로 나타났습니다.

결국 나는 다음과 같이 타협했습니다.나는 SkipBytes()를 한 번 호출하고 그것이 올바른 바이트 수보다 적은 수를 반환하면 나머지 바이트에 대해 readFully()를 호출합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top