2012-02-24 4 views
0

클라이언트에서 들어오는 POST로 로그 파일에 쓰는 프로세스 (실제로 웹 서버)가 있습니다. 이 시간을 잘 99 % 작동하지만 때때로 라인이 I에 의해 읽어라인이 완료되기 전에 BufferedReader readLine

  BufferedReader reader = new BufferedReader(new FileReader(logFilePath)); 
      String line = null; 

      while (true) 
      { 
        if ((line = reader.readLine()) != null) 
        { 
          if (firstLine == null) firstLine = line; 
          processLine(line); 
          continue; 
        } 

        try 
        { 
          Thread.sleep(sleepTime); 
          long ts = System.currentTimeMillis(); 
        } catch (InterruptedException e) { 
          Thread.currentThread().interrupt(); 
          break; 
        } 
      } 

: 다음

나는 루프에서 (꼬리 -f)과 같은 로그 파일을 읽고 별도의 프로세스를 BufferedReader.readLine은 완전한 행이 아닙니다. 나는 작가 (웹 서버)가 파일의 모든 바이트를 아직 플러시하지 않았기 때문이라고 생각한다.

이 문제를 수정하거나 해결할 제안이 있습니까? 고마워요!

+0

라인이 완료되지 않았을 때 감지 할 패턴이 있습니까? – VirtualTroll

+0

그냥 빠른 포인터 :'while (true) ... break'을 사용할 필요가 없습니다. 변수를 사용하여 계속해야하는지 확인할 수 있습니다. – Viruzzo

+0

이게 도움이 될 것 같습니다. http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#sync() – nullpotent

답변

1

하나의 파일에 거의 동시에 액세스해야하는 여러 프로세스 (일반적으로 한 프로세스가 자주 사용됨)에서 작업 한 결과 (예 : 다른 개발자와 함께) "예고편"파일 한 프로세스가 다른 프로세스가 액세스해야하는 파일과 상호 작용할 때를 나타내는 데 사용하는 것이 좋습니다.

웹 서버가이 로그에 얼마나 자주 쓰고 있는지, 그리고 얼마나 빨리 Java 프로세스에서 읽어야하는지 잘 모르겠지만 각 프로세스가 파일에 액세스하는 사이에 시간이 경과하면 예고편 파일을 볼 수 있습니다 귀하의 웹 서버가 언제 파일에 쓰는지를 나타내는 쓰여지는 것. Java 프로세스는 예고편 파일이 있는지 여부를 먼저 확인한 다음 예고편 파일을 찾은 다음 삭제하고 로그에서 읽습니다.

그렇지 않으면 OS 명령을 사용하여 웹 서버가 로그에 쓰고 있는지 확인하고 그렇지 않은 경우 로그 판독기 만 실행해야 할 수도 있습니다. http://blog.bensmann.com/executing-operating-system-commands에는 Java에서 OS 명령을 실행하는 데 유용한 정보가 있습니다.

요점은 이러한 프로세스가 동시에 로그를 읽거나 쓰지 않도록 확립 된 일종의 단단한 간격이 필요하다는 것입니다.

+0

Zack에게 감사드립니다. 웹 서버는 매 초마다 kB의 꽤 빠르며, 몇 줄의 줄과 coule을 작성하며 점점 커지고 있습니다. 웹 서버의 작성이 완료되었는지 여부를 확인하는 데 많은 비용이 들지는 확실하지 않습니다. 글쓴이가 글을 쓰는 데 도움이된다면 독자가 조금 뒤쳐지지는 않을지 모르지만 그 방법은 확실하지 않습니다. –

-1

나는 최근에 동일한 문제에 직면했다. bufferreader가 readline() 메소드를 사용하여 불완전한 라인을 읽을 때를 설명하겠습니다. 캐리지 리턴 이전에 EOF가 발생하면이를 수행합니다.

의 BufferedReader의 readine의 코드는 운송 전에 EOF가 발생하면 그것은 이미 읽은대로 돌아갑니다 돌아 있다고이

if (nextChar >= nChars) 
        fill(); 
       if (nextChar >= nChars) { /* EOF */ 
        if (s != null && s.length() > 0) 
         return s.toString(); 

        else 
         return null; 
       } 

같다. 그러나 올바른 코드는 readLine()을 호출 할 때 캐리지 리턴 전에 EOF 문자가 발생하면 불완전한 줄 대신 NULL을 반환해야합니다.

위에서 설명한 시나리오에서 ReadLine이 NULL을 반환하는 확장 버퍼 처리기 클래스를 작성했습니다.

+1

"EOF 문자"란 무엇입니까? –

+0

코드에 EOF 문자를 인용 한 내용은 없습니다. EOF 문자가 없습니다. EOF * 조건이 있습니다. * – EJP

관련 문제