2011-02-13 4 views
3

저는 스캐너를 사용하여 로그 파일의 행을 읽고 각 행을 구문 분석하여 중요한 것을 찾는 프로그램을 작성했습니다. 로그 파일의 모든 행을 읽는 것이 중요합니다. 각 줄을 스캔하기 위해 다음 코드를 작성했습니다.큰 파일을 읽는 동안 java.util.Scanner가 오작동합니다.

Scanner s = new Scanner(new File("Large.log")); 
while(s.hasNextLine()) 
{ 
    String line = s.nextLine(); 
    //do the processing of the log line 
} 

위의 코드는 이상한 방식으로 동작합니다. [1 백만 줄 이후] 임의의 수의 줄을 긋고 줄을 읽지 않습니다. 위의 코드를 수정하여 마지막 줄을 확인하고 메모장 ++을 사용하여 로그 파일을 검사했습니다. 해당 줄 다음에 파일에 많은 줄이 남아 있습니다. while 루프가 끝난 후 다른 System.out.println(s.hasNextLine())을 추가하고 false를 인쇄합니다.

그러나 내가 BufferedReader을 사용하여 위의 작업을 수행하려고하면 프로그램이 올바르게 작동합니다. Java의 util IO 클래스에 제한이 있습니까?

+0

BufferedReader를 사용하는 경우 readLine() 또는 read()를 사용하고 있습니까? 또한 마지막 줄은 무작위로 고정되거나 고정되어 있거나 파일이나 화면에 대한 인쇄물에 의해 결정되는 "임의의 줄 수"입니까? –

+0

동일한 readLine을 사용했습니다. 마지막 줄은 무작위입니다. 읽히는 선의 수는 무작위였다. –

+0

미안하지만 다른 바보 같은 질문을 읽는 동안 파일에 줄을 추가하는 다른 프로세스가 있습니까? 예를 들어 실제로 읽히는 라인의 난수가 실제로 증가합니까? –

답변

3

특정 JVM 구현과 관련하여 large file support 문제로 보입니다. 많은 표준 파일 I/O가 32 비트 OS에서 4GB가 넘는 파일에서는 작동하지 않는 것이 일반적인 문제입니다. 일반적으로 대용량 파일을 명시 적으로 지원하는 파일 API의 대체 버전이 있지만 JVM을 구현하는 사람은이를 사용하는 것을 기억해야합니다. 호기심에서 당신은 어떤 OS를 사용하고 있으며 64 비트입니까?

+0

Windows 7 64 비트를 사용하고있었습니다. JDK 1.6 Update 21. 로그 파일은 3.12GB였습니다. –

0

임시 파일에 50자를 포함하는 문자열을 덤프하여 방금 5 백만 번 반복했습니다. 그리고 스캐너는 파일을 한 줄씩 읽으려고 할 때 잘 작동합니다.

나는 귀하의 경우 두 가지 문제를 참조하십시오

  1. 당신이 라인을 읽기 위해 스캐너의 내부 버퍼 크기를 전달하는 거대한 라인을 읽으려는 수 있음을?
  2. 다른 프로세스/스레드가 동일한 파일을 동시에 수정할 수 없기를 바랍니다.
관련 문제