如何让Java每分钟将一个ArrayList的内容写入文件?

时间:2011-02-18 09:57:14

标签: java filewriter

关于上述主题的简短问题。基本上,我正在编写一个软件,它从网络中捕获数据并将其写入外部文件以供进一步处理。

我想知道的是,为了达到预期的效果,最好使用哪些代码。

感谢您的时间

大卫

3 个答案:

答案 0 :(得分:6)

我可能会使用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);

否则quarts是一个功能强大的java调度程序,它能够处理更高级的调度需求。

答案 1 :(得分:4)

您可以使用Executor框架,这是一个示例实现:

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 */);

答案 2 :(得分:0)

这个问题可能需要更多细节。解决方案的哪个部分会给您带来麻烦?

  • 日程安排?
  • 从网络上读书?
  • 内存数据结构的持久性?
  • 写入文件?

您还应该更详细地描述问题域,因为它可能会显着影响可能提供的任何解决方案。例如:

  • 通过网络传输数据的性质是什么?
  • 是否必须每分钟?如果网络未完成发送并且分钟已启动并且您开始阅读该怎么办?
  • ArrayList到底包含什么?
  • 你能描述文件输出吗? (文本文件?序列化对象?等...)

仅仅是我最初的预感 - 在设计解决方案时我会想到的一些想法会涉及某种生产者 - 消费者方法。

  • 一个Runnable / Thread对象,其唯一责任是从网络中连续读取,汇总数据并将其放入同步队列中。
  • 处于wait()状态的Runnable / Thread对象,观察同步队列。当队列发出信号时,它将开始读取队列的内容以便持久保存到文件中。
  • 如果队列中有项目(或达到某个阈值时),它将通知()等待队列读取器开始使用队列中的对象进行持久化。

我可能完全偏离基础,但你从网络上读书的事实意味着某种不可预测性和不可靠性。因此,我不依赖于计时器,而是依靠数据的生产者(从网络读取对象)向消费者(将使用从网络读取的数据的对象)发信号通知数据。