1

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

我想知道的是最好使用什么代码来获得这种预期的效果。

谢谢你的时间

大卫

4

3 回答 3

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 调度程序,能够处理更高级的调度需求。

于 2011-02-18T10:00:37.473 回答
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 */);
于 2011-02-18T10:08:24.280 回答
0

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

  • 调度?
  • 来自网络的阅读?
  • 内存数据结构中的持久性?
  • 写入文件?

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

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

只是我最初的预感——在为您描述的问题设计解决方案时,我会有一些想法涉及某种生产者-消费者方法。

  • 一个 Runnable/Thread 对象,其唯一职责是不断地从网络中读取数据,组装数据并将其放入同步队列中。
  • 处于等待()状态的可运行/线程对象观察同步队列。当队列发出信号时,它将开始读取队列的内容以持久保存到文件中。
  • 当队列中有项目时(或达到某个阈值时),它将通知()等待队列读取器开始消费队列中的对象以进行持久性。

我可能完全没有根据,但是您从网络上阅读的事实意味着某种不可预测性和不可靠性。因此,我不依赖计时器,而是依赖数据的生产者(从网络读取的对象)向消费者(将使用从网络读取的数据的对象)发出信号来处理数据。

于 2011-02-18T10:24:38.960 回答