Вход в файл в Android с помощью java.util.logging - PullRequest
0 голосов
/ 24 января 2012

Я хочу добавить механизм регистрации в моем Android, в котором я хочу записывать сообщения в файл на SD-карте.

Поскольку мне приходилось регистрироваться из разных потоков, и поскольку я не хочу, чтобы эти потоки были заблокированы, я попытался выполнить регистрацию в другом потоке.

Пока что я создал класс, похожий на этот -

public class TestLogger {

    private static String LOG_FILE_NAME = "/logs.txt";
    private static int LOG_FILE_SIZE_LIMIT = 100 * 1024;

    private static FileHandler logHandler;  
    private static Logger logger;
    private static ExecutorService executorService;

    public synchronized static void init() {
        String logFilePathName = Environment.getExternalStorageDirectory() + LOG_FILE_NAME;

        try {
            logHandler = new FileHandler(logFilePathName, LOG_FILE_SIZE_LIMIT, 1, true);
            logHandler.setFormatter(new SimpleFormatter());
            logger = Logger.getLogger("com.test.android");
            logger.setLevel(Level.ALL);
            logger.addHandler(logHandler);
            executorService = Executors.newFixedThreadPool(1);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private synchronized static void writeLog(String msg) {
        if(logger == null) 
            return;
        logger.log(Level.FINE, msg);
    }

    public static void logMessage(String msg) {
        executorService.submit(new LogToFile(msg));
    }

    private static class LogToFile implements Runnable {

        String msg;

        public LogToFile(String msg) {
            this.msg = msg;
        }

        @Override
        public void run() {
            TestLogger.writeLog(msg);
        }
    }

}

При входе в приложение я вызываю TestLogger.init() и с этого момента я вызываю `TestLogger.logMessage ("журнал сообщений ");всякий раз, когда мне нужно что-то записать в файл.

Это прекрасно работает, но вместо создания logs.txt я также вижу созданные другие файлы.Как logs.txt.1 и logs.txt.2 вместе с их файлами .lck.Имея ключевое слово synchronized, разве я не убедился, что никакие два потока не пишут в один и тот же файл одновременно?

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Я сейчас использую очередь блокировки для выполнения этой работы. теперь отлично работает :)

0 голосов
/ 24 января 2012

synchronized работает с переменными, а не с файлами. Вы можете использовать блок synchronized для заполнения строителя строк, например, и запишите в файл на последнем шаге.

...