#java
#java
Вопрос:
я использовал следующий метод для чтения строк из ТЕКСТОВОГО файла, когда он обновляется или новые строки вставляются в текстовый файл, я должен напечатать эту новую строку
поиск внутри этого сайта дает мне идею, но она не работает
FileReader fr = new FileReader("filename.txt");
BufferedReader reader = new BufferedReader(fr);
while (true) {
String line = reader.readLine();
if (line != null) {
// Use line
}
else {
thread.sleep(1000);
}
}
что я делаю не так?
Примечание: мне нужно записать новые строки, добавленные к текстовому файлу во время выполнения цикла, надеюсь, вам это понятно
Комментарии:
1. Вы имеете в виду, что он изменяется во время выполнения цикла while?
2. Бесконечный цикл. Остерегайтесь
3. Как вы обновляете файл?
4. Похоже, вы хотите сделать что-то вроде Unix tail -f. Это верно?
5. Только что попробовал на моей машине. Ваш код, похоже, делает то, что вы хотите. Вот почему я спрашиваю, как обновить ваш файл
Ответ №1:
import java.io.File;
import java.io.RandomAccessFile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Tailer implements Runnable {
private File file;
private int runEvery;
private long lastPosition = 0;
private boolean run = true;
public Tailer(String inputFile, int interval) {
file = new File(inputFile);
this.runEvery = interval;
}
public void stop() {
run = false;
}
public void run() {
try {
while(run) {
Thread.sleep(runEvery);
long fileLength = file.length();
if(fileLength > lastPosition) {
RandomAccessFile fh = new RandomAccessFile(file, "r");
fh.seek(lastPosition);
byte c;
while((c = (byte)fh.read()) != -1) {
System.out.print((char)c);
}
lastPosition = fh.getFilePointer();
fh.close();
}
}
}
catch(Exception e) {
stop();
}
}
public static void main(String argv[]) {
ExecutorService executor = Executors.newFixedThreadPool(4);
Tailer tailer = new Tailer("test.log", 1000);
executor.execute(tailer);
}
}
Комментарии:
1. Спасибо, это сработало для меня, но как я изменяю его, чтобы читать всю строку, а не байт за байтом
2. на самом деле, это работает не так, как ожидалось, когда мне нужно читать его построчно, не могли бы вы мне помочь?
3. Зачем вам нужно было читать именно строки? Что означает «работает не так, как ожидалось»?
4. мое требование — захватывать каждую строку и выполнять какой-либо процесс в этой строке, поэтому мне нужно проверять каждую строку отдельно. не так, как ожидалось, означает, что указатель неправильно перемещается на следующую строку, он отбрасывает первый символ в строке
5. Как ни странно, я не могу его воспроизвести. Все работает.
Ответ №2:
Вы можете использовать класс apache commons «org.apache.commons.io.input.Хвостовик».
TailerListener listener = new MyTailerListener();
Tailer tailer = new Tailer(file, listener, delay);
// simple executor impl. for demo purposes
Executor executor = new Executor() {
public void execute(Runnable command) {
command.run();
}
};
executor.execute(tailer);
Например
class MyTailerListener extends TailerListenerAdapter {
public void handle(String line) {
System.out.println(line);
}
}
TailerListener listener = new MyTailerListener();
Tailer tailer = Tailer.create(file, listener, 10000);
tailer.stop()
Ответ №3:
В Linux,
Файл на самом деле является индексом. Вероятно, ваш старый файл был удален при сохранении с помощью gedit. Например:
Сначала у вас есть filename.txt с индексом под номером 10. И Java его читает. Но когда вы сохраняете редактирование с помощью gedit. Файл, вероятно, заменяется на filename.txt с индексом под номером 11. Но приложение Java все еще считывает индекс 10. Таким образом, приложение не сможет увидеть никаких изменений. Вы можете попробовать использовать «ls -i», чтобы узнать номер индекса вашего файла. Посмотрите, изменилось ли оно после редактирования.
Ответ №4:
Единственное, о чем я могу думать, это то, что ваш файл не сохраняется при внесении изменений, поэтому ваш код никогда не регистрирует новые строки. Кроме того, у него, вероятно, все еще открыт исходный файл, пока вы находитесь в цикле, поэтому он никогда не открывает новый файл с изменениями. Попробуйте поместить открытый файл в цикл while и убедитесь, что файл тоже закрыт.