我希望逐行阅读和写一些文件。
我的第一个想法是使用BufferedReader
和BufferedWriter
但我的问题是我需要知道我的文件有多远。
在阅读时,我想知道我在多大程度上处理文件并且我希望它是准确的,所以在每个readLine()
之后我都希望更新这个位置,这是因为有一个缓冲区。
同样适用于写作,我需要在写一行之前和之后准确地获得位置。我猜这并不困难,因为我的理解是BufferedWriter无论如何都要在每个换行符后刷新,所以考虑到我正在写行,我可以直接写入通道。
在我重新发明轮子之前,或者使用一些狡猾的反射之前,JDK中有什么可以帮我解决这个问题吗?
编辑:为了清理,我正在寻找字节位置。
答案 0 :(得分:0)
根据您的问题,“我处理文件的距离”是什么意思并不完全清楚。这是指行号还是字节位置?
如果这意味着行号,则实际上有两个选项:
A)手动跟踪行号。不应该那么难。只需为每一行增加一个计数器。
B)按照@Jesper
的建议使用java.io.LineNumberReader如果它表示字节位置,则按字符串长度递增字节位置计数器,并且不要忘记在字节位置包含换行符。
写入时,没有LineNumberWriter,因此您需要手动跟踪计数器。不应该很难。
答案 1 :(得分:0)
请参阅以下使用RandomAccessFile读取文件的示例
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Timer;
import java.util.TimerTask;
public class ConsoleReader {
/**
* @param args
*/
public static void main(String[] args) {
File file = new File("fileName");
try {
RandomAccessFile r = new RandomAccessFile(file, "r");
//First time read
String str = null;
while((str = r.readLine()) != null) {
System.out.println(str);
}
r.seek(r.getFilePointer());
startTimer(r);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void startTimer(final RandomAccessFile r) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
String str = null;
try {
while((str = r.readLine()) != null) {
System.out.println(str);
}
r.seek(r.getFilePointer());
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0, 1000);
}
}