자바로 tail -f 를 구현할려고 합니다.
글쓴이: idccc / 작성시간: 금, 2005/05/20 - 5:14오후
자바로 tail -f <file> 를 구현 할려고 합니다..
리눅스 명령어 tail -f <file>를 하면 마지막 몇줄을 우선 보여주고 추가되는 부분을 뿌려주는데.. 이부분을 어떻게 해야할지 몰라서 무식하게 readLine()를 여러번 호출하여서 mark하고 출력 하고있습니다.
근데 이 부분도 파일 전체의 라인 갯수를 구하는 방법을 몰라서 넘길 라인을 인자로 받아서 처리 하고있습니다.
리눅스 명령어 wc -l <file> 같은 효과를 낼려면.. 자바에서 어떻게 구현 해야 할까요?
api가 있는지 잘 모르겠습니다...
아니면 readLine()를 여러번 호출하지 않고도 효과적으로 마지막 몇 라인부터 출력하는 방법있으면 조언 부탁드립니다.
1만 라인이 넘어가는 파일을 넘겨주니 처음 실행에 readLine()을 출력한다고 실행속도가 꽤 늦네요.
많은 가르침 부탁드립니다.
Forums:
으음..
뒤에서부터 읽는 방법이 있지 않을까요? :)
없나.. orz
Re: 으음..
제가 아는게 워낙 없어서..
일단 일반적인 File 객체엔 지원되는 메서드가 없는것 같습니다.. api를 뒤져도 안나오더라구요.
그리고 RandomAccessFile 객체도 임이의 위치에가서 읽기, 쓰기는 가능한데 마찬가지 뒤에서 부터 읽긴 api에 안나오구요..ㅠㅠ
혹시 다른 스트림에 필터링해서 뒤에서부터 읽기가 가능한 방법이 있나요?
file size - 1k byte 정도 skip을 한 다음 거기서부터
file size - 1k byte 정도 skip을 한 다음 거기서부터 readLine을 하고 첫 readLine을 무시하면 라인 단위로 뒷 부분 1k byte 정도는 나오겠죠.
RandomAccessFile의 length를 구해서 1K byte[]
RandomAccessFile의 length를 구해서 1K byte[] buffer에 파일의 끝 부분을 적절히 readFully를 써서 넣고, 그 버퍼를 꺼꾸로 읽어 나가면서 new Line이 있는지를 검사해서 라인 카운트로 break하는 Loop에서 파일의 seek position을 찾으면 될 듯 합니다.
----
I paint objects as I think them, not as I see them.
atie's minipage
뒷부분을 읽어 오는 것은 파일의 길이와 읽어 오는 위치를 정할 수 있을
뒷부분을 읽어 오는 것은 파일의 길이와 읽어 오는 위치를 정할 수 있을 테니까 구현하면 될 것 같습니다.
그런데, 파일의 내용이 바뀐다면 (길이가 길어지거나 삭제되거나 하는) 그것을 tail 이 어떻게 감지하느냐가 더 중요할 것 같습니다. 기존의 tail 이 쓰는 몇가지 전략을 참조해서 java 에 대응시키는 것이 좋을 듯 합니다.
댓글 달기