2013-02-18 2 views
0

스트림에서 필요한 바이트 수를 건너 뛸 수있는 FilterInputStream 클래스의 skip 메서드를 사용하려고했습니다. 그러나 스킵 방법에 대한 설명서는 말한다 http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterInputStream.html#skip(long)FilterInputStream의 skip 메서드 사용

스킵 이상 파기 입력 스트림에서 n 바이트의 데이터를. 여러 가지 이유로 건너 뛰기 메서드가 일부 바이트보다 작은 숫자로 건너 뜁니다. 0 일 수 있습니다. 실제로 건너 뛴 바이트 이 반환됩니다.

특정 위치로 이동하기 위해 건너 뛰기 방법을 사용하는 것이 안전합니까?

답변

0

이 API는 약간 문제가 있음을 발견했습니다. 그것은 특정 구현에 너무 많은 자유를 잎 : 그것은 스트림이 비어있을 때 있는지 분명하지 않다)

1) 그것은 분명하지 않다

2 스트림

의 말의 경우에는 무슨 일이 반복적으로 호출 건너 뜁니다 결국은 양수를 반환합니다.

당신은 n은 스트림의 끝을지나 아니라는 것을 알고 있다고 가정하고, (2) 보유하고 있다고 가정, 다음 코드는 유용 할 수 있습니다

public static void skipSecure(InputStream is, long n) throws IOException { 
    while (n >= 0) { 
     long skipped = is.skip(n); 
     n -= skipped; 
    } 
} 
+0

은 아마 우리가 그것을 사용할 수 있습니다; 그래도 전문적으로이 방법을 사용하는 것이 좋습니다. – agaase

+0

@ mivaas19 : 계약 내용을 알고있는 특정 InputStream 구현에 사용하는 경우 안전합니다. 그러나 skip 메서드는 스트림에서 효율적인 건너 뛰기를 지원할 때만 유용합니다 (예 : 메모리의 바이트 배열에 의해 지원되는 ByteArrayInputStream 또는 디스크의 섹터를 뛰어 넘을 수있는 FileInputStream). 다른 경우에는 읽기를 사용하여 스킵을 구현할 수 있습니다. –

0

FilterInputStream은 기본 InputStream의 래퍼 일 뿐이므로 기본 InputStream.skip 동작에 따라 달라집니다. FileInputSttream 인 경우 FileInputSttream.skip API를 참조해야합니다.

skip 메서드는 여러 가지 이유로 인해 더 작은 바이트 수를 건너 뛸 수 있습니다. n이 음수이면 IOException 이 경우 InputStream 수퍼 클래스의 skip 메소드가 아무것도 수행하지 않더라도 throw됩니다. 건너 뛴 실제 바이트 수가 반환됩니다. 이 메서드는 백업 파일에 남아있는 바이트보다 많은 바이트를 건너 뛸 수 있습니다. 이렇게해도 예외는 발생하지 않고 건너 뛴 바이트 수에는 백업 파일의 EOF를 초과 한 바이트 수가 포함될 수 있습니다. 스트림을 지나서 건너 뛴 후에 스트림에서 읽으려고하면 파일의 끝을 나타내는 -1이됩니다.

이 설명에서 FileInputStream.skip은 나에게 신뢰할만한 것으로 보이지 않습니다.