生成txt文件

#背景:
##在工作中不可避免的需要和其他系统交互,双方系统就会出现数据共享的情况。本次背景是我方作为供述方,供述多个表数据,其中就有上千万级别的数据,每天全量供述!!!可怕,
使用SSM框架(spring+springMVC+Mybatis),MySQL
##面对这样情况,需要考虑流的使用;还要注意不可能一次查询全部数据,再一次性写入txt文件里,需要分批次查询、写入。血的教训呀!!!
刚开始的代码

 BufferedWriter bw=null;
        try {
            bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName,true),encoding));
            if (dates != null) {
                for (ElnMapJob job : dates) {
                    String order="";
                    try {
                        if(job != null) {
                            //处理从数据库查询出null,转换成空字符串
                            if (job.getOrderNo() != null && !"".equals(job.getOrderNo())) {
                                order = String.valueOf(job.getOrderNo());
                            }
                            String str = job.getJobId() + "|" + job.getObjectType() + "|" + job.getObjectId() + "|" + job.getObjectTitle()
                                    + "|" + job.getMapId() + "|" + order + "|" + sdf.format(job.getCreateTime()) + "||||";

                            bw.write(str + System.getProperty("line.separator"));
                        }
                    } catch (Exception ie) {
                        log.error("t_eln_map_job"+job.getJobId()+"(JobId)写入txt文件失败!!!出错原因:"+ie.getMessage());
                    }
                }
            }
        } catch (Exception e) {
            log.error("eln_map_job数据生成Txt文件时出现错误!!!!!!!!!!!!!出错原因:"+e.getMessage());
        }finally {
            if(bw !=null){
                try {
                    bw.close();
                } catch (IOException ce) {
                }
            }
        }

写成这样的后果是,面对千万级别的数据,每次写数据时,都需要重复的打开关闭txt文件,导致速度越来越慢,最后几乎就打不开了。。。而且使用limit 查询数据时,越到后面查询效率越低(sql的写法问题),看似简单的sql,可能他的效率很低,需要多换几种写法测试他们的效果。
##在发布时验证的效果,现改

private void writeElnMapJobTxtFile(File fileName, List<ElnMapJob> dates) {
   RandomAccessFile raf=null;
        try {
            raf=new RandomAccessFile(fileName,"rw");
            if (dates != null) {
                for (ElnMapJob job : dates) {
                    String order="";
                    try {
                        if(job != null) {
                            //处理从数据库查询出null,转换成空字符串
                            if (job.getOrderNo() != null && !"".equals(job.getOrderNo())) {
                                order = String.valueOf(job.getOrderNo());
                            }
                            String str = job.getJobId() + "|" + job.getObjectType() + "|" + job.getObjectId() + "|" + job.getObjectTitle()
                                    + "|" + job.getMapId() + "|" + order + "|" + sdf.format(job.getCreateTime()) + "||||";
                            raf.seek(raf.length());
                            raf.write((str + System.getProperty("line.separator")).getBytes(encoding));
                        }
                    } catch (Exception ie) {
                        log.error("t_eln_map_job"+job.getJobId()+"(JobId)写入txt文件失败!!!出错原因:"+ie.getMessage());
                    }
                }
            }
        } catch (Exception e) {
            log.error("eln_map_job数据生成Txt文件时出现错误!!!!!!!!!!!!!出错原因:"+e.getMessage());
        }finally {
            if(raf !=null){
                try {
                    raf.close();
                } catch (IOException ce) {
                }
            }
        }

换一种流,速度贼快。三四个小时跑不完的任务,20分钟解决。
"RW“读写方式,
1.RandomAccessFile特点
  RandomAccessFile是java Io体系中功能最丰富的文件内容访问类。即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。
  因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类。
  与OutputStearm,Writer等输出流不同的是,RandomAccessFile类允许自由定位文件记录指针,所以RandomAccessFile可以不从文件开始的地方进行输出,所以RandomAccessFile可以向已存在的文件后追加内容。则应该使用RandomAccessFile。

2.RandomAccessFile的整体介绍
   RandomAccessFile类包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由的移动记录指针,即可以向前移动,也可以向后移动。RandomAccessFile包含了以下两个方法来操作文件的记录指针.

long getFilePointer(); 返回文件记录指针的当前位置
void seek(long pos); 将文件记录指针定位到pos位置
RandomAccessFile即可以读文件,也可以写,所以它即包含了完全类似于InputStream的3个read()方法,其用法和InputStream的3个read()方法完全一样;也包含了完全类似于OutputStream的3个write()方法,其用法和OutputStream的3个Writer()方法完全一样。除此之外,RandomAccessFile还包含了一系类的readXXX()和writeXXX()方法来完成输入和输出。

RandomAccessFile有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已,一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象还需要指定一个mode参数。该参数指定RandomAccessFile的访问模式,有以下4个值:

“r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
“rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
“rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
“rwd” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容每个更新都同步写入到底层设备。
关于此流的信息

JAVA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值