Мне нравится использовать Log.d (TAG, некоторая строка, часто String.format ()).
TAG - это всегда имя класса
Transform Log.d (TAG, -> Logd (в тексте вашего класса
private void Logd(String str){
if (MainClass.debug) Log.d(className, str);
}
). Таким образом, когда вы готовы сделайте выпускную версию, установите MainClass.debug в false!
Since Java 7 there has been the newWatchService() method on the FileSystem class.
However, there are some caveats:
Before Java 7 it is not possible with standard APIs.
I tried the following (polling on a 1 sec interval) and it works (just prints in processing):
private static void monitorFile(File file) throws IOException {
final int POLL_INTERVAL = 1000;
FileReader reader = new FileReader(file);
BufferedReader buffered = new BufferedReader(reader);
try {
while(true) {
String line = buffered.readLine();
if(line == null) {
// end of file, start polling
Thread.sleep(POLL_INTERVAL);
} else {
System.out.println(line);
}
}
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
As no-one else has suggested a solution which uses a current production Java I thought I'd add it. If there are flaws please add in comments.
Это невозможно с классами стандартной библиотеки. Подробнее см. Этот вопрос .
Для эффективного опроса лучше использовать Произвольный доступ . Это поможет, если вы запомните позицию последнего конца файла и начнете чтение оттуда.
Используйте Java 7 WatchService , часть NIO.2
API WatchService разработан для приложений, которым необходимо уведомлять о событиях изменения файлов.
Чтобы расширить последнюю запись Ника Фортескью, ниже приведены два класса, которые вы можете запускать одновременно (например, в двух разных окнах оболочки), которые показывают, что данный файл может одновременно записываться одним процессом и считываться другим.
Здесь два процесса будут выполнять эти классы Java, но я предполагаю, что процесс записи может происходить из любого другого приложения. (Предполагая, что он не удерживает исключительную блокировку файла - существуют ли такие блокировки файловой системы в определенных операционных системах?)
Я успешно протестировал эти два класса как на Windoze, так и на Linux. Я очень хотел бы знать, есть ли какое-то условие (например, операционная система), при котором они не работают.
Класс №1:
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
public class FileAppender {
public static void main(String[] args) throws Exception {
if ((args != null) && (args.length != 0)) throw
new IllegalArgumentException("args is not null and is not empty");
File file = new File("./file.txt");
int numLines = 1000;
writeLines(file, numLines);
}
private static void writeLines(File file, int numLines) throws Exception {
PrintWriter pw = null;
try {
pw = new PrintWriter( new FileWriter(file), true );
for (int i = 0; i < numLines; i++) {
System.out.println("writing line number " + i);
pw.println("line number " + i);
Thread.sleep(100);
}
}
finally {
if (pw != null) pw.close();
}
}
}
Класс №2:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class FileMonitor {
public static void main(String[] args) throws Exception {
if ((args != null) && (args.length != 0)) throw
new IllegalArgumentException("args is not null and is not empty");
File file = new File("./file.txt");
readLines(file);
}
private static void readLines(File file) throws Exception {
BufferedReader br = null;
try {
br = new BufferedReader( new FileReader(file) );
while (true) {
String line = br.readLine();
if (line == null) { // end of file, start polling
System.out.println("no file data available; sleeping..");
Thread.sleep(2 * 1000);
}
else {
System.out.println(line);
}
}
}
finally {
if (br != null) br.close();
}
}
}