2010-03-24 51 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 

我已經越來越多的錯誤,並不知道爲什麼。我剛剛發現這是因爲我正在閱讀的一些文件具有UNIX風格的換行符,\ r \ n,有些文件只是windows風格的\ n。

是否有一個容易使RandomAccessFile將所有換行符視爲Windows風格的換行符?

回答

1

你可以隨時備份流了兩個字節,重新閱讀,看它是否是\ r \ 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 2010-03-29 20:06:59

1

編號RandomAccessFile和相關的抽象(包括底層文件系統)模型文件作爲可索引的字節序列。他們既不知道也不關心線路或線路終端。

你需要做的是記錄行開始的實際位置,而不是試圖找出它們基於關於行終止序列的假設的位置。或者,使用線讀取器捕獲它讀取的每一行的行終止序列,作爲行的一部分或讀取每個輸入行後可訪問的屬性。

或者,在打開它們進行隨機訪問之前,將所有文件轉換爲使用DOS行終止序列。

+0

這不是一個選項,因爲我必須先閱讀該行以決定是否可以回溯。感謝您的意見。 – bcoughlan 2010-03-29 20:04:52