2011-08-18 3 views
1

UTF-8 인코딩 된 텍스트가 포함 된 파일을 열고 싶습니다. 위치를 설정하고 25 줄을 읽을 수 있으며 위치를 가져올 수 있습니다.FileInputStream 및 BufferReader를 사용하여 RandomAccessFile의 seek() 및 getFilePointer()를 구현하는 방법은 무엇입니까?

불행히도 RandomAccessFile은 UTF-8 인코딩을 지원하지 않습니다. 그래서이 코드를 작성했습니다. 반환 된 오프셋 값을 갖는 getParsedLines() 메서드를 다음 25 행을 읽도록 재귀 호출하지만 처음 1-25 행을 인쇄 한 다음 349-373, 695-719 등을 인쇄합니다. 내가 마지막으로 내가 1-25, 26-50, 51-75를 인쇄 할 수 있습니다 올바른 오프셋 얻을 수있는 방법

public long getParsedLines(File file, long offset) { 


    int counter = 0; 
    FileInputStream fis = null; 
    InputStreamReader streamReader = null; 
    BufferedReader br = null; 
    try { 
     fis = new FileInputStream(file); 
     fis.getChannel().position(offset); 
     streamReader = new InputStreamReader(fis, "UTF8"); 
     br = new BufferedReader(streamReader); 
     String str; 
     while (counter <= 24) { 
      if ((str = br.readLine()) != null) { 
       System.out.println(str); 
      } else { 
       offset = -1; 
       break; 
      } 
      counter++; 
     } 
     if (fis != null) { 
      offset = fis.getChannel().position(); 

     } 
    } catch (IOException ex) { 
    } finally { 
     try { 
      if (fis != null) { 
       fis.close(); 
      } 
     } catch (IOException ex) { 
     } 

    } 

    return offset; 
} 

. 76-100 등.

예 .. 일부 이전 버전과의 호환성을 위해 필자는 readLine()을 사용하여 텍스트 파일을 "한 줄씩"읽어야하며 전체 텍스트가 아닌 한 번에 25-25 줄만 읽어야한다는 제약이 있습니다.

+0

RandomAccessFile은 UTF-8을 지원하지 않습니다. –

+0

@Rocky utf-8 데이터가 포함 된 파일을 읽는 메커니즘이 없습니다. –

+0

readUTF() 및 writeUTF() 메서드가 없습니다? –

답변

1

BufferedReader는 미리 읽기를 수행하므로 기본 파일의 위치> BufferedReader가 도달 한 논리 위치입니다. DataInputStream.readLine()을 시도해 볼 수 있습니다.이 메소드는 더 이상 사용되지 않으며 더 이상 사용되지 않으며 Javadoc에서 언급 된 문제를 Deprecation에 대해 처리하지 않습니다.

+0

이것은 합리적인 해결 방법처럼 보이며 DataInput에 있기 때문에 RandomAccessFile 자체를 계속 사용할 수 있습니다. :) – Trejkaz

0

이렇게하면 반드시 BufferedReader.skip 메서드를 사용하여 문자를 건너 뛸 수 있습니다 (이미 읽은 문자 수를 유지). 하지만 가능한 한 자동으로 올바른 위치에 놓 이도록 (닫지 않고) 동일한 BufferedReader을 유지하는 것이 좋습니다.

관련 문제