2015-01-25 4 views
0

내 응용 프로그램은 줄 단위로 텍스트 파일을 읽고 파일 끝까지 각 줄의 오프셋을 기록합니다. 그러나 position()은 항상 0을 반환합니다. 내 코드가 잘못되었습니다.FileChannel의 position() 메서드가 항상 0을 반환하는 이유는 무엇입니까?

String buffer; 
long offset; 
RandomAccessFile raf = new RandomAccessFile("data.txt", "r"); 
FileChannel channel = raf.getChannel(); 
BufferedReader br = new BufferedReader(new InputStreamReader(Channels.newInputStream(channel))); 

while (true) { 
    offset = channel.position(); // offset is always 0. why? 
    if ((buffer = br.readLine()) == null) // buffer has correct value. 
     return; 
    ……………………………… 
} 
+0

'InputStream'을 원한다면 직접'FileInputStream'을 사용하지 않을까요? 적어도'FileChannel'을 가져 와서'InputStream'으로 래핑하는 것보다 잠재적으로 더 효율적입니다. –

답변

0

코드를 실행할 때 오프셋이 항상 0이 아닌 오류를 재현 할 수 없습니다. 아직도, 그것은 당신이 기대하는 것을하지 않습니다. FileChannel 상단에 BufferedReader을 만듭니다. BufferedReader은 버퍼를 채우고 (따라서 채널의 오프셋을 증가시킵니다) 버퍼에서 비워 질 때까지 버퍼에서 읽습니다. 따라서 br.readLine()을 한 번 호출 한 후 오프셋은 읽은 문자열의 길이가 아니라 버퍼의 길이입니다.

BufferedReaderFileInputStream을 직접 사용하고 문자를 다른 방법으로 계산할 수 있습니다.

+0

당신 말이 맞아요. readLine 이후 처음으로 한 번 업데이트됩니다. 그러나 결코 업데이트되지 않습니다. getBytes를 사용하여 오프셋을 얻습니다. 그것은 작동합니다. 고맙습니다. – user3152056

관련 문제