簡體   English   中英

使用RandomAccessFile到達文件中的特定行

[英]Reaching a specific line in a file using RandomAccessFile

是否可以通過RandomAccessFile將光標定位到文件中特定行的開頭?

例如,我想在文件中第111行的char 10到20之間更改String。 該文件具有固定長度的記錄。

是否可以使用RandomAccessFile將光標直接定位到第111行的開頭?

更新:

我使用了以下代碼。 但是,它返回null。

行長度為200個字符(如果我沒有錯,則為200個字節)

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.skipBytes(200 * 99);   // linesize * (lineNum - 1) 
System.out.println(r.readLine());

我哪里錯了?

我不確定,但似乎RandomAccessFile不支持這樣的功能。 由於RAF以字節操作,我們可以跳過特定的字節數,如果你的文件有固定的行寬,這可以通過實現

file.skipBytes(110 * lineSizeInBytes);

否則,你需要這樣的東西:

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();

您無法使用RandomAccessFile直接執行此操作。 它可以處理二進制文件,並幫助您在任何隨機位置讀取和寫入此類文件片段。 這就是該類被稱為RandomAccessFile

但它對文本沒有用處,所以它沒有辦法識別行尾,根本就沒有行。

因此,要實現您想要的功能,您應該使用BufferedReader ,逐行讀取,如果您希望每行開始的存儲位置,那么您將能夠跳過所需的字節數以跳轉到所需行的開頭。

要使用RandomAccessFile,您需要具有固定長度的記錄或者具有到每個記錄的開頭(或者例如,每第10個記錄)的偏移的“塗料向量”。 這些可能適合您的問題,也可能不適合。

正如其他一些人所說,還有其他專門用於讀取文本行的類,例如BufferedReader。 但是,如果您需要使用RandomAccessFile,則可以讀取文本行,但是您需要以編程方式查找1行結束的位置和另一行開始...

一個簡單的例子可能是......

RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r");
String line = "";
while (raf.available()){
  byte b = raf.read();
  if (b == '\n'){
    // this is the end of the current line, so prepare to read the next line
    System.out.println("Read line: " + line);
    line = "";
    }
  else {
    line += (char)b;
    }
  }

這為查找每行結尾的閱讀器提供了基本構建塊。

如果你打算沿着使用RandomAccessFile的道路走下去,你可以從這個框架開始,但是你需要注意一些缺點並得到諸如......之類的東西...... 1. Unix和Windows使用不同的行標記 - 你我需要尋找'\\ n','\\ r'以及這兩者的組合2.一次讀取一個字節非常慢 - 你應該將一個字節塊讀入一個數組緩沖區(例如一個字節) [2048]數組)然后遍歷數組,當到達緩沖區數組的末尾時,從RandomAccessFile重新填充數組。 3.如果要處理Unicode字符,則需要一次讀取和處理2個字節,而不是單個字節。

RandomAccessFile非常強大,但是如果你可以使用像BufferedReader這樣的東西,那么你可能會更好地使用它,因為它會自動處理所有這些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM