В Java, к чему лучший/самый безопасный шаблон для контроля файла, добавляемого?

Мне нравится использовать 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!

13
задан Nick Fortescue 2 July 2009 в 09:37
поделиться

4 ответа

Since Java 7 there has been the newWatchService() method on the FileSystem class.

However, there are some caveats:

  • It is only Java 7
  • It is an optional method
  • it only watches directories, so you have to do the file handling yourself, and worry about the file moving etc

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.

7
ответ дан 1 December 2019 в 22:58
поделиться

Это невозможно с классами стандартной библиотеки. Подробнее см. Этот вопрос .

Для эффективного опроса лучше использовать Произвольный доступ . Это поможет, если вы запомните позицию последнего конца файла и начнете чтение оттуда.

2
ответ дан 1 December 2019 в 22:58
поделиться

Используйте Java 7 WatchService , часть NIO.2

API WatchService разработан для приложений, которым необходимо уведомлять о событиях изменения файлов.

3
ответ дан 1 December 2019 в 22:58
поделиться

Чтобы расширить последнюю запись Ника Фортескью, ниже приведены два класса, которые вы можете запускать одновременно (например, в двух разных окнах оболочки), которые показывают, что данный файл может одновременно записываться одним процессом и считываться другим.

Здесь два процесса будут выполнять эти классы 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();
        }
    }

}
2
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: