2010-04-03 1 views
0

은 기본적으로 내가 같은 텍스트 파일을 필요 후면에서 전면에 TEXTFILE에 라인을 통해 반복 않습니다는 구한거야 나는

헨리
의 순서로 파일에서 읽을 수 있습니다.버니
프레드

내가에서 읽고 있어요 실제 파일은> 30메가바이트 그리고 그것은 전체 파일을 읽을 수있는 완벽한 솔루션 미만 배열로 분할에서 이동 한 다음 배열을 리버스 것 그곳에. 너무 오래 걸립니다. 내 구체적인 목표는 문자열의 첫 번째 항목 (이 경우 "InitGame")을 찾은 다음 해당 줄의 시작 부분의 위치 시작 부분을 반환하는 것입니다.

저는 파이썬에서 이와 비슷한 것을했습니다. 내 방법은 파일의 끝에 - 1024를 찾은 다음 끝에 도달 할 때까지 줄을 읽은 다음 이전 시작 지점에서 1024를 찾고 tell()을 사용하여 이전에 도착했을 때 멈출 것입니다. 출발점. 그래서 내가 찾던 텍스트를 찾을 때까지 파일의 끝에서 뒤로 블록을 읽을 것입니다.

지금까지 자바에서이 작업을 수행하고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다. 볼티모어 근처에 살면 신선한 구운 쿠키를 가져 오는 경우도 있습니다.

감사합니다.

상세 정보 :

는 내가 읽고있다 파일 I가 서버를 호스팅 게임에 대한 로그 파일이기 때문에 뒤로 검색해야 (| ERR |는이다 도시 테러 서버를 확인하십시오.). 로그 파일은 게임에서 발생하는 모든 이벤트를 기록한 다음 프로그램에서 각 이벤트를 구문 분석하고 처리 한 다음 이에 따라 행동합니다 (예 : 사람들의 헤드 샷을 추적하고 자동으로 d- 가방 인 사람들을 쫓아냅니다.). 가장 최근의 InitGame 항목을 검색하여 모든 플레이어 개체를 인스턴스화하고 해당 게임이 시작된 이래로 돌봐야 할 기타 항목을 처리 할 수 ​​있도록해야합니다. 이 파일에는 수백 개의 InitGame 이벤트가 있지만 마지막 이벤트를 원합니다. 거꾸로 검색 할 필요가없는 더 좋은 방법이 있다면 알려 주시기 바랍니다.

감사

+0

쿠키가 유혹적이지만 볼티모어 근처에 있지 않으므로 답변이 없습니다. ;) 실제로 파일에서 뒤로 검색하는 이유를 분명히하지 않았습니다. 대상 문자열이 항상 끝에 있다는 것을 모를 경우 파일 전방위를 읽는 것과 관련하여 많은 추가 작업을 수행해야합니다. 자바에서 seek/tell 접근법은 알고리즘 적으로 동일 할 것이고, 탐색 할 수있는 InputStream이 필요하다. – msw

답변

1

당신은 RandomAccessFile의를 사용하여 파이썬 솔루션을 반복하고 그 위에 LineNumberReader (또는 독자)의 사용자 지정 하위 클래스가 될 수 있습니다.

0

리눅스에는 자바로 시도하는 것보다 더 적합한 텍스트 구문 분석 도구가 있습니다.

+0

저는 알고 있습니다 ... 불행히도이 응용 프로그램은 Linux, Windows 및 Mac에서 실행됩니다. – rogue780

0

역으로 검색 할 때 두 가지 대답이 떠오릅니다. 첫 번째는 앞으로 검색하고 파일의 끝에 도달하면 마지막으로 찾은 InitGame 텍스트를 유지합니다. 파일을 읽는 동안 다른 InitGame이 올 때마다 덮어 씁니다.

두 번째 해결책은 파일 크기를 확인하는 것입니다 (f.length())를 InitGame 스 니펫의 최대 크기보다 큰 덩어리로 나눕니다. (재미있는 부분에서 두 개의 덩어리를 오른쪽으로 나눠서 문제를 피하려면) 마지막 부분부터 읽기 시작하고 파일쪽으로 진행합니다 start (Reader의 skip() 함수를 사용하여 원하는 읽기 위치로 건너 뛰기 : 파일 분할 필요 없음). 재미있는 다중 바이트 문자가 없다면 RandomAccessFile이 유용 할 수 있습니다.

가장 효율적인 솔루션은 로그 파일 출력을 마지막으로 찾은 InitGame에 대한 참조를 유지하면서 읽는 것입니다. 그렇게하면 동일한 데이터를 두 번 다시 읽지 않아도됩니다. 자바 프로그램이 몇 초에 한 번 깨어나 파일을보고 새로 추가 된 라인을 읽도록 설정할 수도 있습니다.

0

그래서 내가하는 일을 정확하게 설명 할 때 좀 더 자세한 설명이 필요합니다. 기본적으로 저는 실행중인 게임 서버를 관리하는 프로그램을 작성하고 있습니다. 프로그램이 게임과 동기화되도록하려면 가장 최근의 InitGame 행을 찾아서 거기에서 읽어야합니다. 이렇게하면이 모든 히트, 킬, 연결 및 연결 해제를 기록 할 수 있습니다. . 로그 파일은 매우 거대 할 수 있기 때문에 (내가 마지막으로 정리 한 것을 잊어 버린 것은 500MB 이상의 텍스트였습니다), 앞에서 검색하는 것이 아니라 뒤에서 검색하고 싶습니다. Java에서는이를 수행 할 내장 된 방법이 없었습니다. 많은 양의 인터넷을 검색 한 후, 나는 이걸 보았다 : http://mattfleming.com/node/11. 그로부터 BackwardsFileInputStream 클래스를 꺼내서 사용했습니다. 그런 다음 제 신청서에서 문자를 뒤집습니다. 다음 번에는 내 자신의 방법을 구성 할 수 있어야합니다. 이제 어떻게 완료되고 더 나은 이해가 이루어지는 지 알 수 있습니다.

그래서 프로그램이 가장 최근의 InitGame에서 로그 파일을 읽으면 tail -f를 모방하고 작성된대로 로그 파일을 읽습니다.