需求是这样,现在有大数据量的数据,要写文件保存,要求是:1、用JAVA将数据写入文件,每10分钟切换一个文件。2、文件命名以时间交替下去,例如,2009-08-24 14:00.txt、2009-08-24 14:10.txt  或者200908241400.txt、200908241410.txt、.....
请教大家,谢谢!

解决方案 »

  1.   

    在你的工程中使用Spring+quartz,快速完成一个定时器,定时写文件,文件名称取格式化后的系统时间
      

  2.   

    Spring    Quartz 实现起来好方便的
      

  3.   

    quartz我用过,它用来控制定时的任务是挺方便
    Spring+quartz 具体指的是?有否小例子贴一个,谢谢
      

  4.   

    log4j可以干,可是有可能有问题.
    定时器在交换文件的时候处理也肯能有点累.但是我的办法是自己实现了一个写数据机制.首先,把输出数据和输出时间组合在一起,看做消息.然后实现一个消息队列.然后每次轮询,取出队列中所有消息,根据时间,拼接好要输出的byte[],然后打开时间对应的文件写入.注意多线程处理.
    得到的是一个比log4j效率高跟多的文件日志模块.楼主喜欢自己写,中间很多问题等待你解决:)
      

  5.   

    Quartz 简单
    "0 0,10,20,30,4,50 * * *"这么写就可以了。他们会在指定的时间启动你的程序的。你的程序根据当前时间,写对应的日志就行了。
      

  6.   

    队列要自己实现.用这个就是为了不堵.
    每次轮询的时候引用当前的队列尾部,他们新的数据过来,往后加就不管了,这次就处理这么多.因为不同的节点是不同对象,所以添加数据的时候和删除不用同步在一个对象上.当时这个东西多线程添加消息,单线程输出文件.同步处理费了点功夫,不过不难.内存消耗多些,尽量重用byte[].测试过10000多线程不停的输出.window,双核机器,和Log4j比较,log4j死了;我的运行时消耗资源大,但是没死,没丢数据.
    关键在于,每次同一个文件的数据要在程序里面拼好,每次就write一次.
      

  7.   

    下面是一个用Timer的示例代码.import java.io.*;
    import java.util.*;
    import java.text.*;
    public class Test{ 
    //public static Timer t=new Timer();
        public static void main(String args[]) throws Exception {
         long timeT=0;
        
         //下面的循环是为了从下一下整10分钟开始:
         //
         do{
         timeT=System.currentTimeMillis()/1000;
        
         }while(timeT%600!=0);
        
         //开始计时,并每隔10分钟执行一次wirteFile();
         //
         Timer t=new Timer();
         t.schedule(new TimerTask(){
         public void run(){
         writeFile();
         }
         },0,600000);   //1000*60*10为10分钟
             }
    }我的测试结果:F:\java>java Test
    writing to file :20090824034000.txt
    waiting......
    writing to file :20090824035000.txt
    waiting......
      

  8.   

    import java.io.*;import java.util.*;
    import java.text.*;
    public class Test{ 
    //public static Timer t=new Timer();
        public static void main(String args[]) throws Exception {
         long timeT=0;
        
         //下面的循环是为了从下一下整10分钟开始:
         //
         do{
         timeT=System.currentTimeMillis()/1000;
        
         }while(timeT%600!=0);
        
         //开始计时,并每隔10分钟执行一次wirteFile();
         //
         Timer t=new Timer();
         t.schedule(new TimerTask(){
         public void run(){
         writeFile();
         }
         },0,600000);   //1000*60*10为10分钟
             }    public static void writeFile(){
         SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmss");
         String fileName=sdf.format(new Date())+".txt";        //用日期生成文件名.
         System.out.println("writing to file :"+fileName);
         System.out.println("waiting......");
        
        }
    }