2010-03-24 2 views
0

나는 RandomAccessFile의를 추구하기 위해 노력하고있어 및 알고리즘의 일부로서 내가Java RandomAccessFile - 다른 줄 바꿈 스타일을 다루고 있습니까?

String line = raf.readLine(); 
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length()); 

//m is a Matcher for regular expressions 

나는했습니다를 한 줄을 읽은 다음 줄 끝에서 뒤쪽으로 추구해야 off-by-one 오류가 많이 발생하여 이유를 파악할 수 없었습니다. 방금 읽은 파일 중 일부는 유닉스 스타일의 줄 바꿈, \ r \ n, 일부는 창 스타일 \ n을 가지고 있기 때문에 발견했습니다.

RandomAccessFile을 가지고 쉽게 모든 라인 피드를 Windows 스타일의 라인 피드로 취급합니까?

답변

1

당신은 항상 2 바이트 스트림을 백업 할 수 있고이 있는지를 다시 읽어 \ 연구 \ n 또는 (! \ R) \ n은

String line = raf.readLine(); 
raf.seek(raf.getFilePointer()-2); 
int offset = raf.read() == '\r' ? 2 : 1; 
raf.read(); //discard the second character since you know it is either \n or EOF by definition of readLine 
raf.seek (raf.getFilePointer() - (line.length()+offset) + m.start() + m.group().length()); 

잘 모르겠어요 정확히 어디에 파일 포인터를 놓으려고하므로 2/1 상수를 적절하게 조정하십시오. 파일에서 빈 줄 (\ n \ n)에 대한 추가 검사를 추가해야 할 수도 있습니다. 예를 들어, 빈 줄을 지나치는 코드없이 무한 루프에 걸릴 수도 있습니다.

+0

감사합니다. 이것이 결국 내가해야 할 일입니다. 나는이 코드를 많이 읽었 기 때문에 물었다. 코드 시작 부분에서 줄 끝에 '\ r'이 있는지 확인했습니다. 일치하는 경우 변수를 1로 설정하고 반대쪽은 0으로 설정 한 다음이 변수를 raf.seek (...)에 추가했습니다. 도움 주셔서 감사합니다. – bcoughlan

1

No. RandomAccessFile 및 관련된 추상화 (기본 파일 시스템 포함) 모델 파일을 색인화 가능한 바이트 순서로 나열합니다. 그들은 회선이나 회선 종단에 대해 알지도 모릅니다.

당신이해야 할 일은 라인 종료 시퀀스가 ​​무엇인지에 대한 가정에 기초하여 라인 시작의 실제 위치를 기록하는 것입니다. 또는 읽는 각 줄에 대한 줄 끝 시퀀스를 줄의 일부로 또는 각 입력 줄을 읽은 후에 액세스 할 수있는 특성으로 캡처하는 줄 판독기를 사용합니다.

또는 임의의 액세스를 위해 파일을 열기 전에 모든 파일을 DOS 줄 끝 시퀀스를 사용하도록 변환하십시오.

+0

내가 다시 백 트랙을 걸 수 있는지 결정하기 위해 선을 먼저 읽어야했기 때문에 이것은 옵션이 아니 었습니다. 의견을 보내 주셔서 감사합니다. – bcoughlan