2010-04-26 4 views
2

텍스트 파일이 있습니다. 한 줄에서 다른 줄로 내용을 검색하고 싶습니다. 예를 들어, 파일은 200K 회선 일 수 있습니다. 저는 78 행에서 2735 행까지 내용을 읽길 원합니다. 파일이 매우 클 수 있기 때문에 전체 내용을 메모리로 읽어 들이고 싶지는 않습니다.자바에서 텍스트 파일을 읽으십시오.

답변

0

다음은 가능한 해결책의 시작입니다. 따라서 파일의 마지막 줄을 읽으려면 이전 줄을 모두 읽을 필요가 없습니다. 그 줄로 건너 뛸 수 있습니다.

+0

'//assume '을'assert'로 바꾸고 끝에'; '를 추가하십시오. –

+0

또한, (틀림없이) 더 간단한'BufferedReader' 대신에 스캐너를 사용할 이유가 있습니까? 또한 파일에서 읽는 문자 인코딩 사용을 지정하지 않으므로 운이 좋으면 그 부분을 남겨 두게됩니다. –

+0

@ Joachim, 좋은 지적, 나는 나의 대답을 편집했다! 'BufferedReader'에 관해서, 나는 그렇게 많이 중요하지 않다고 생각한다. 나는 틀린가? –

0

먼저 줄 단위로 줄 번호를 세고 언급 한 줄 위치에서 필요한 내용을 가져 오기 시작하십시오.

11

BufferedReader.readLine()을 사용하고 행을 계산하십시오. 버퍼 크기와 현재 줄만 메모리에 유지합니다.

아니요, 모든 파일의 크기가 고정되어 있지 않다면 그 시점까지 전체 파일을 읽지 않고 3412 행에 도달 할 수 없습니다.

public static List<String> linesFromTo(int from, int to, String fileName) 
     throws FileNotFoundException, IllegalArgumentException { 
    return linesFromTo(from, to, fileName, "UTF-8"); 
} 

public static List<String> linesFromTo(int from, int to, String fileName, String charsetName) 
     throws FileNotFoundException, IllegalArgumentException { 

    if(from > to) { 
     throw new IllegalArgumentException("'from' > 'to'"); 
    } 
    if(from < 1 || to < 1) { 
     throw new IllegalArgumentException("'from' or 'to' is negative"); 
    } 

    List<String> lines = new ArrayList<String>(); 
    Scanner scan = new Scanner(new File(fileName), charsetName); 
    int lineNumber = 0; 

    while(scan.hasNextLine() && lineNumber < to) { 
     lineNumber++; 
     String line = scan.nextLine(); 
     if(lineNumber < from) continue; 
     lines.add(line); 
    } 

    if(lineNumber != to) { 
     throw new IllegalArgumentException(fileName+" does not have "+to+" lines"); 
    } 

    return lines; 
} 
0

나는 RandomAccessFile의를 사용하는 것이 좋습니다 것,이 클래스를 사용하면 파일의 특정 위치로 이동 할 수 있습니다 :

+1

바이트 인덱스와 행 번호 사이에 고정 된 관계가 없기 때문에이 방법은 도움이되지 않습니다. 선은 원하는만큼 길거나 짧을 수 있으므로 한 번 끝나면 데이터를 읽어야합니다. 마지막 행을 읽는 것이이 방법으로 향상 될 수 있지만 (일반적으로 파일에 큰 행이 하나만있는 경우는 제외) 일반적으로 도움이되지 않습니다. –

관련 문제