Как заставить Java записывать содержимое ArrayList в файл раз в минуту? - PullRequest
1 голос
/ 18 февраля 2011

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

Я хочу знать, какой код лучше всего использовать для достижения желаемого эффекта.

Спасибо за ваше время

Дэвид

Ответы [ 3 ]

6 голосов
/ 18 февраля 2011

Я бы, вероятно, реализовал это, используя TimerTask .Например,

int hour = 1000*60*60;
int delay = 0;
Timer t = new Timer();

t.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        // Write to disk ...
    }
}, delay, hour);

В противном случае кварт - это мощный планировщик Java, способный обрабатывать более сложные задачи планирования.

4 голосов
/ 18 февраля 2011

Вы можете использовать Executor Framework, вот пример реализации:

final List<String> myData = new ArrayList<String>();
final File f = new File("some/file.txt");

final Runnable saveListToFileJob = new Runnable(){

    @Override
    public void run(){ /* this uses Guava */
        try{
            Files.write(
                Joiner.on('\n').join(myData),
                f, Charsets.UTF_8);
        } catch(final IOException e){
            throw new IllegalStateException(e);
        }

    }
};
Executors
    .newScheduledThreadPool(1) /* one thread should be enough */
    .scheduleAtFixedRate(saveListToFileJob,
        1000 * 60 /* 1 minute initial delay */,
        1, TimeUnit.MINUTES /* run once every minute */);
0 голосов
/ 18 февраля 2011

Вопрос, вероятно, нуждается в нескольких деталях.Какая часть решения доставляет вам неприятности?

  • Планирование?
  • Чтение из сети?
  • Постоянство в структуре данных памяти?
  • Запись в файл?

Вы также должны описать проблемную область немного подробнее, так как онаможет существенно повлиять на любое решение, которое может быть предложено.Например:

  • Какова природа данных, передаваемых по сети?
  • Должно ли это быть в минуту?Что, если сеть не закончила отправку, а минута истекла, и вы начали читать?
  • Что именно содержит ArrayList?
  • Можете ли вы описать вывод файла?(текстовый файл? сериализованный объект? и т. д.)-Потребительский подход.
    • Объект Runnable / Thread, единственной обязанностью которого является непрерывное чтение из сети, сбор данных и помещение их в синхронизированную очередь.
    • A Runnable / Threadобъект в состоянии ожидания (), наблюдающий синхронизированную очередь.Получив сигнал от очереди, он начнет читать содержимое очереди для сохранения в файл (ы).
    • Когда в очереди есть элементы (или когда достигнут определенный порог), он уведомляет () ожидающего чтения очереди, чтобы начать потреблять объекты из очереди на постоянство.

    Возможно, я совершенно не в базе, но тот факт, что вы читаете из сети, подразумевает некоторую непредсказуемость и ненадежность.Поэтому вместо того, чтобы полагаться на таймеры, я бы полагался на источник данных (считывающий объект из сети), который сигнализирует потребителю (объекту, который будет использовать данные, считываемые из сети), что-то делать с данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...