stream流批量读取并合并文件

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.channels.FileChannel;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import com.ist.common.properties.SysConfig;

/**
 * 文件合并
 *
 *
 *
 */
public class ServerTemplate extends Template {
    /** 跨平台的换行符  */
    public static final String LINE_SEPARATOR = System.getProperty("line.separator");

    /**
     * 合并文件
     * @Method       mergeFiles
     * @Author       lbh
     * @Date         2014-12-11 下午02:59:54
     * @param outFile 路径+输出文件名
     * @param files 输入文件列表
     */
    public boolean mergeFiles(String outFile, List<String> files) {

        boolean mergeResult = true;
        FileChannel fileOutChannel = null; //声明通道
        FileReader fileReader = null;
        BufferedReader bufferedReader = null ;

        try{
            if(files == null || files.size() < 1){
            logger.info("Make sure there have outnumber 2 files ");
            //System.out.println("Make sure there have outnumber 2 files ");
            mergeResult = false;
            }
            else if(files.size() == 1){//只有一个文件,那么只要改名即可
                File file = new File(files.get(0).toString());
                file.renameTo(new File(outFile));
            }
            else{
                fileOutChannel = new FileOutputStream(outFile).getChannel(); //实例化输出通道,此时将

创建文件。

                //循环所有文件
                /*Iterator it = fileMap.keySet().iterator();
                int i = 0; //计数
                while(it.hasNext()){*/
                for(int i=0; i<files.size();i++){
                    //System.out.println(files.get(i));
                    File file = new File(files.get(i).toString());
                    if(!file.exists()){//容错检查
                        logger.info("Make sure every file is existed");
                        //System.out.println("file:"+ files.get(i) +" is not existed");
                    }
                    fileReader = new FileReader(file);

                    if(!fileReader.ready()){//容错检查
                        logger.info("Make sure every file is existed");
                        //System.out.println("file "+ files.get(i) +" is not already to

read");
                    }
                    bufferedReader = new BufferedReader(fileReader);
                    /*InputStreamReader inputStreamReader = new InputStreamReader(new

FileInputStream(files[i]),"UTF-8");//此为stream方式读文件,做备用。
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);*/

                    //开始处理文件
                    if(bufferedReader != null){
                        if(i == 0){ //如果是首个文件,那么除去最后一行保留前两行再写入
                            mergeResult = handleFile("fist", bufferedReader, outFile);
                        }
                        else if(i == files.size() - 1){ //如果是最后一个文件,那么去除前两行

,保留最后一行
                            mergeResult = handleFile("last", bufferedReader, outFile);
                        }
                        else{ //其他则同时去除前两行和最后一行
                            mergeResult = handleFile("normal", bufferedReader, outFile);
                        }
                        //System.out.println("file:"+ files.get(i) +" merge sate is --

"+mergeResult);
                        //logger.info("file:"+files.get(i)+" merge sate is --

"+mergeResult);
                    }

                    //删除该文件
                    file.delete();
                }
            }
            } catch (IOException e){
                e.printStackTrace();
                return mergeResult;
            }

            //关闭

            if(fileOutChannel !=null){
                try{bufferedReader.close();}catch (IOException ignore) {return mergeResult;}
            }
            if(fileReader !=null){
                try{fileReader.close();}catch (IOException ignore) {return mergeResult;}
            }
            if(bufferedReader !=null){
                try{bufferedReader.close();}catch (IOException ignore) {return mergeResult;}
            }

        return mergeResult;

    }

    /**
     * 处理单个文件,读取后立即写入, type:fist--首个文件;last--末个文件;以及其他文件
     * @Method       handleFile
     * @Author       lbh
     * @Date         2014-12-11 上午09:49:19
     */
    public static boolean handleFile(String type, BufferedReader bufferedReader, String outFile){
        boolean handleResult = false; //是否成功
        FileWriter fileWriter = null;
        String readString = ""; //存放读取数据的变量
        String strA,strB,strC; //临时变量
        try{
            fileWriter = new FileWriter(outFile,true);
            if("fist".equals(type)){ //首文件的处理
                strA = "";
                strB = "";
                strC = "";
                int fistI = 0;//计数
                while((strC = bufferedReader.readLine()) != null){ //从第一行开始循环读
                    strA = strB;
                    strB = strC;
                    readString = strA + LINE_SEPARATOR;//最后一行的strB被丢弃
                    //输出
                    if(fistI > 0){//避免第一行空行
                        fileWriter.write(readString);
                    }
                    fistI ++;
                }
                handleResult = true;
            }
            if("last".equals(type)){ //末文件的处理
                strA = "";
                bufferedReader.readLine();
                bufferedReader.readLine(); //执行两次,已读取并丢弃了前两行。
                while((strA = bufferedReader.readLine()) != null){ //开始循环读
                    readString = strA + LINE_SEPARATOR;

                    //输出
                    fileWriter.write(readString);
                }
                handleResult = true;
            }
            else { //其他文件的处理
                strA = "";
                strB = "";
                strC = "";
                bufferedReader.readLine();
                bufferedReader.readLine(); //执行两次,已读取并丢弃了前两行。
                long i = 0;
                while((strC = bufferedReader.readLine()) != null){ //开始循环读
                    strA = strB;
                    strB = strC;
                    readString = strA + LINE_SEPARATOR;//最后一行的strB被丢弃

                    //输出
                    if(i > 0){//避免第一行空行
                        fileWriter.write(readString);
                    }
                    i ++;
                }
                handleResult = true;
            }
        }
        catch (IOException e) {
            e.printStackTrace();
            return handleResult;
        }
        finally{
            try{
                bufferedReader.close();
                fileWriter.close();
                }
            catch (IOException ignore) {return handleResult;}
        }

        return handleResult;
    }

    public static void main(String[] args) throws Exception{
        /*System.out.println("开始");
        List<String> ssss = new ArrayList<String>();
        ssss.add("E:\\111\\xmlTest\\a.xml");
        ssss.add("E:\\111\\xmlTest\\b.xml");
        ssss.add("E:\\111\\xmlTest\\c.xml");
        ServerTemplate st = new ServerTemplate();
        st.mergeFiles("E:\\111\\xmlTest\\stream2.xml", ssss);
        System.out.println("结束");*/
    }

}

时间: 2024-11-07 16:59:53

stream流批量读取并合并文件的相关文章

使用spreadsheet-reader流式读取超大excel文件

github:https://github.com/nuovo/spreadsheet-reader 最近有一个读取超大excel文件的功能需求,使用的phpexcel,有严重的内存泄露问题,暂时还未找到解决方案. spreadsheet-reader是流式读取excel的,对于大多数格式的excel都能正常的读取,且内存消耗很小. PS:其中遇到的坑 xlsx文件一定要标准,也就是必须是offce生成的,而不是wps之类的--被这个坑了很久 如果不正确会出现如下报错,个人猜测是文件头问题,建议

java批量读取多个文件并存入数据库

文件中的数据量大,想要入库,统计分析: 代码如图: package com.mobile.web.api; import com.mobile.commons.JsonResp; import com.mobile.model.LogInfo; import com.mobile.service.LogInfoService; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import o

ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让用户下载,那么在Controller的Action中用Response.Body这个Stream流,来逐步发送文件数据到客户端浏览器是最好的办法. 但是我今天在ASP.NET Core MVC的Controller的Action中使用Response.Body输出数据到客户端浏览器的时候遇到了个问题

java mysql大数据量批量插入与流式读取分析

总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取->处理->写入. 1 读取操作开始遇到的问题是当sql查询数据量比较大时候基本读不出来.开始以为是server端处理太慢.但是在控制台是可以立即返回数据的.于是在应用 这边抓包,发现也是发送sql后立即有数据返回.但是执行ResultSet的next方法确实阻塞的.查文档翻代码原来mysql驱动默

Java中的文件和stream流的操作代码

1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;class FileRead{    public static void main(String[] args) throws IOException{        //创建一个FileWriter对象    //FileWriter fw=new FileWriter("File01.txt"

批量读取excel文件内容代码

最近工作需要批量添加映射excel文件字段的代码  于是通过读取excel2007实现了批量生成代码,记录下代码 需要引入poi的jar包 import java.awt.List; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import org.apache.poi

R8&mdash;批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到以公司ID生成的指定文件夹下!所以第一个问题就是200多个公司,不可能每一次下载,都要去点击:新建文件夹,然后对文件夹命名,too boring and monotonous.嘿嘿,幸好有R的陪伴! let's do it,来看看R如何完成这些工作! 主要用到两个函数 一. dir.create-生

PHP流式读取XML文件

之前在项目中有读取XML的需求,一开始采用的是simplexml将xml文件全部load到内存里,然后一个节点一个节点读的方式,后来随着XML文件的增大,内存被撑爆了.于是赶紧想办法,于是有了流式读取.一开始老大给了我一个封装XMLReader的类,但是我发现这个类不是很符合我的要求,于是又把XMLReader按我的要求重新封装了一遍,在此感谢老大moon. 目前我的类非常简单就提供几个方法,我提供了Demo供大家参考使用.话不多说上代码 ? 1 2 3 4 5 6 7 8 9 10 11 12

Java学习笔记之I/O流(读取压缩文件以及压缩文件)

1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给BufferedReader类实例化,从而使得指定项的内容输出到内存中. 2.压缩文件:ZipOutputStream 2.1 注意,zipOut.putNextEntry(entry);// 此方法会清空zip文件原来存在的内容,然后写入文件,并将流定位到条目数据的开始处,直到关闭ZipOutputSt