我想实现一个功能,程序启动后,实时接收其它程序传过来的对象,把对象的内容写入到本地的文件中,每30分钟生成一个文件。例如生成文件如下:
文件按时间随机命名:20120311134030.txt,文件内容
对象1
对象2
....
半小时后,生成第二个文件20120311142030.txt,文件内容
对象3
对象4
.....我现在实现了启动进程后,一直运行着,实时接收传过来的数据,每接收一个对象,生成一个文件。不知道怎么控制,可以让程序自己判断,每过30分钟,才关闭写入。然后再把接下来接收到的写入到新的文件中去。

解决方案 »

  1.   

        将你的程序看成server端。当server端遇到连接请求时,新建一个线程来处理,这个处理过程可以放在一个独立的类中实现,并且开始计时,当到了30分钟时关闭这个线程。在server端用isCancel方法检查线程是否关闭,要是关闭了就重新new一个线程。
      

  2.   

    或者你根据输入来判断获取输出流,例如:4:00-4:30那么输出流应该是new FileOutputStream("...0400.txt");这样来处理也可以
      

  3.   

    呵,这个我以前用sql server2000实现过定时备份文件夹的功能,其实很简单的
      

  4.   

        谢谢大家,我按9楼 preferme 的思路写了,多线程接收数据没有问题,但多线程写入同一个文件有问题,如果文件被锁,其它线程无法写入,前面接收的数据会不会丢失?
        后来我是这样实现的,每个线程接收完数据,单独写入文件,这样只有接收数据时用多线程。最终服务器的指定位置生成了大量文件,我写了个脚本,每10分钟把这些文件合并成一个。
      

  5.   

        已经完成了功能测试,等项目验收完了。下一步,我还得改造一下,要系统自己按要求写入,而不是再通过shell合并文件。另外请问6楼的abstruct 这位朋友,你提的这个疑问该如何处理呢?是不是可以在写入文件之后判断时间是否超过30分钟,超过后另建一个新文件呢?
        其实我还是顾虑我上面提到的那个问题,文件被锁,前面接收的数据会不会丢?
        希望大家继续提供建议,今天下班前结贴。
      

  6.   

    楼主没必要多线程写日志。将处理的数据写入硬盘文件,这个效率基本都是固定的,优化的余地,在于用什么样的方式将数据写入文件。一般情况,都是InputStream流方式,RandomAccessFile方式效率更低,楼主不妨试试内存映射方式,
    采用Channel和MappedBuffer来更新数据。
    多个线程操纵一个文件进行数据存储,是十分困难的,即使在你知道目标文件的大小情况下,
    写入数据也会因为线程安全而最终变成依次写入。和一个线程持续写入,差不太多。多个线程分别生成多个文件,最后再合并成一个文件。
    这就要看合并的方式咯,如果合并的方式不佳,最终效果,还会不如单线程的持续写入的效果。
    如果楼主有兴趣玩多个线程写一个文件的话。
    不妨试试,多个线程同时向文件的内存映射当中写入数据,
    当数据达到一定的量(或某个条件)时,统一更新到硬盘中去。