2013-06-01 3 views
2

파일 크기가 8KB보다 큰 경우 왜 LAST 바이트를 읽습니다 = 0입니까?Java BufferedInputStream 동작

private static final int GAP_SIZE = 8 * 1024; 

public static void main(String[] args) throws Exception{ 
    File tmp = File.createTempFile("gap", ".txt"); 
    FileOutputStream out = new FileOutputStream(tmp); 
    out.write(1); 
    out.write(new byte[GAP_SIZE]); 
    out.write(2); 
    out.close(); 
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(tmp)); 
    int first = in.read(); 
    in.skip(GAP_SIZE); 
    int last = in.read(); 
    System.out.println(first); 
    System.out.println(last); 
} 
+2

실제 바이트 수 스킵이 보장되지 않는다. 그것을 확인해야합니다. 네이티브 파일 시스템 블록 크기를 지나치는 것을 원하지 않는 것 같습니다. – Perception

답변

2

InputStream API에 따르면 skip 메소드가 여러 가지 이유로 더 작은 바이트 수를 건너 뛸 수 있다고합니다. 이

... 
long n = in.skip(GAP_SIZE); 
System.out.println(n); 
... 

는 이것은 당신이 그것을 제거하면 (어쨌든이 구체적인 경우에 improove하지 성능 않음)는 예상 된 결과를 얻을 것이다, 구현 세부 사항을 BufferedInputStream을 관련이 8192 예상 대신 8191를 인쇄 해보십시오

... 
InputStream in = new FileInputStream(tmp); 
... 

출력

1 
2 
+0

혼란 스럽습니다 ... 원인이 FileInputStream의 건너 뛰기 메서드 인 경우 BufferedInputStream을 제거하면 문제가 해결되는 이유는 무엇입니까? – marcolopes

+0

실제 원인은 BufferedInputStream 구현 세부 사항입니다. FileInputStream은 정상적으로 작동합니다. –

+0

음, 그렇습니다. 그러나 FileInputStream Skip이 말한 것처럼 여전히 혼란 스럽습니다 : "건너 뛰기 메소드가 여러 가지 이유로 더 작은 바이트 수 ". – marcolopes

1

지각으로 말하면, skip의 반환을 확인해야합니다.

long skipped = in.skip(GAP_SIZE); 
System.out.println("GAP: " + GAP_SIZE + " skipped: " + skipped) ; 
if(skipped < GAP_SIZE) 
{ 
    skipped = in.skip(GAP_SIZE-skipped); 
} 

FileInputStreamskip 섹션에 명시된 바와 같이 : skip 메소드는 다양한 이유로 일부를 스킵 끝낼 수

내가 수표를 추가하고 보상 할 경우 문제를 해결 더 작은 바이트 수, 가능하면 0