2010-03-29 2 views
9

Java로 'tail -f'를 모방 할 수 있어야합니다. 나는 다른 프로세스에 의해 쓰여지고 있기 때문에 로그 파일을 읽으려고하는데 파일을 열어 읽을 때 파일을 잠그고 다른 프로세스는 더 이상 쓸 수 없다. 어떤 도움이라도 대단히 감사하겠습니다! 되는 FileChannel API here에서Java : 잠그지 않고 파일 열기 및 읽기

public void read(){ 
    Scanner fp = null; 
    try{ 
     fp = new Scanner(new FileReader(this.filename)); 
     fp.useDelimiter("\n"); 
    }catch(java.io.FileNotFoundException e){ 
     System.out.println("java.io.FileNotFoundException e"); 
    } 
    while(true){ 
     if(fp.hasNext()){ 
      this.parse(fp.next()); 
     }   
    }  
} 
+0

그 밖의 것이 없다면 jni를 사용하여 win32 API를 얻을 수 있습니다 (Windows를 사용 중이라고 가정 할 경우, 그렇지 않으면 어떤 API를 사용하든간에). – Blindy

+1

win32 api를 사용하는 것은 가장 추악한 일이 될 것입니다;) – Bozho

+0

Heh는 내가 잘 알고있는 자바를 잘 모릅니다. – Blindy

답변

0

봐 : 여기

내가 현재 사용하고 코드입니다. 검사 할 수있는 파일을 잠글 수 있습니다. here

+0

stackoverflow에서 가능한 중복 질문을 볼 수 있습니다. http://stackoverflow.com/questions/128038/how-can-i-lock-a-file- using-java-if-possible – Cshah

+0

흠. 나는 그것을 조사하고 여러 전략을 시도했다. 심지어 FileChannel과 함께 java.io.RandomAccessFile을 사용했지만, 여전히 자바에서 읽고있는 파일에 다른 프로세스가 쓸 수 있도록 관리 할 수 ​​없다. – rogue780

+0

rogue780 - 시도한 전략을 게시하십시오. 파일에 쓰기 전에 다른 프로세스가 독점 잠금을 요구하면 꽤 많은 토스트가 발생합니다 (물론이 상황에서도 꼬리는 작동하지 않습니다). 하지만 파일의 윗부분을 잠그지 않았습니까? –

0

Windows는 파일을 열 때 올바른 공유 플래그를 지정하지 않으면 파일에 대한 필수 잠금을 사용합니다. 바쁜 파일을 열려면 공유 플래그 FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE이있는 Win32-API CreateFile 핸들이 필요합니다.

이것은 몇 군데에서 JDK 내에서 속성 및 내용을 읽을 수있는 파일을 열 때 사용되지만, 자바 클래스 라이브러리 수준에서는 내 보내지도/사용할 수 없다는 것을 알 수 있습니다. 그래서 네이티브 라이브러리를 찾아야합니다. 난 당신이되지 않을 수도 있습니다 빠른 솔루션을 원하는 경우 명령 "cmd /D/C type file.lck"

+1

변경된시기가 확실하지 않지만 RandomAccessFile을 사용하여 열린 파일이 SHARE_READ 및 SHARE_WRITE로 열립니다. ProcMon.exe를 사용하여 테스트했습니다. – kervin

0

에서 process.getInputStream()를 읽을 수 있습니다 주위 빠른 작품으로 생각

가장 우아한, 간단히 파일을 열고, 크기 변경에 대한 파일을 모니터 마지막 위치로 이동, 새 데이터 읽기, 파일 닫기 및 모니터링 유지.

성능에 문제가 없다면 정상적으로 작동합니다. 그러나 성능이 필요한 경우 좀 더 고급 파일 IO API를 기반으로하는보다 정교한 솔루션을 선호해야합니다.

+0

잠금으로 인해 열 수없는 경우 아닙니다. – EJP

5

꼬리 재건은 파일 잘라 내기 및 (중간) 삭제와 같은 특별한 경우 때문에 까다 롭습니다. 그래서 같은 새로운 자바 파일 API와 함께 사용하기 StandardOpenOption.READ을 잠그지 않고 파일을 열려면 :

try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ)) { 
    InputStreamReader reader = new InputStreamReader(is, fileEncoding); 
    BufferedReader lineReader = new BufferedReader(reader); 
    // Process all lines. 
    String line; 
    while ((line = lineReader.readLine()) != null) { 
     // Line content content is in variable line. 
    } 
} 

자바에 꼬리를 만들어 내 시도 다음을 참조하십시오

해당 코드에서 영감을 얻거나 필요한 부분을 복사하는 것이 좋습니다. 내가 알지 못하는 문제가 있으면 알려주십시오.