import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set; public class MergeFileByStream { /** 跨平台的换行符 */
public static final String LINE_SEPARATOR = System.getProperty("line.separator"); /**
* 合并文件 outFileName为路径+文件名
* @Method mergeFiles
* @Description TODO
* @Author LBH
* @Date 2015-3-23 下午4:26:54
* @param
* @return boolean
*/
public boolean mergeFiles(String outFileName, Set<String> files) { boolean mergeResule = false;// 结果
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
String inputEncoding = "UTF-8";
try {
// 验证是否已存在输出文件,存在就删除
File outFile = new File(outFileName);
if (outFile.exists()) {
outFile.delete();
} int i = 0;// 循环计数
Iterator<String> filesIt = files.iterator(); if (filesIt != null && files.size() > 1) {
File inFile = new File(filesIt.next());
inputStreamReader = new InputStreamReader(new FileInputStream(
inFile), inputEncoding);
bufferedReader = new BufferedReader(inputStreamReader); // 开始处理文件
if (bufferedReader != null && bufferedReader.ready()) {
if (i == 0) { // 如果是首个文件,那么除去最后一行保留前两行再写入
mergeResule = handleFile("fist", bufferedReader,outFileName, inputEncoding);
} else if (i == files.size() - 1) { // 如果是最后一个文件,那么去除前两行,保留最后一行
mergeResule = handleFile("last", bufferedReader,outFileName, inputEncoding);
} else { // 其他则同时去除前两行和最后一行
mergeResule = handleFile("normal", bufferedReader,outFileName, inputEncoding);
}
}
// 删除该文件
inFile.delete();
i++;
} else if (filesIt != null && files.size() == 1) {// 若只有一个文件,那么直接改名字
File inFile = new File(filesIt.next());
inFile.renameTo(new File(outFileName));
}
} catch (Exception e) {
e.printStackTrace();
} // 关闭
finally {
if (bufferedReader != null) {
try {bufferedReader.close();} catch (Exception e) {e.printStackTrace();}
}
if (inputStreamReader != null) {
try {inputStreamReader.close();} catch (Exception e) {e.printStackTrace();
}
}
}
return mergeResule;
} /**
* 处理单个文件,读取后立即写入, type:fist--首个文件;last--末个文件;以及其他文件
*
* @Method handleFile
* @Author lbh
* @Date 2014-12-11 上午09:49:19
*/
public static boolean handleFile(String type, BufferedReader bufferedReader, String outFile, String outEncoding) {
boolean handleResult = false; // 是否成功
FileOutputStream fileOutputStream = null;
OutputStreamWriter outputStreamWriter = null;
String readString = ""; // 存放读取数据的变量
String strA, strB, strC; // 临时变量
try {
fileOutputStream = new FileOutputStream(outFile, true);
outputStreamWriter = new OutputStreamWriter(fileOutputStream, outEncoding); 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) {// 避免第一行空行
outputStreamWriter.write(readString);
outputStreamWriter.flush();
}
fistI++;
}
handleResult = true;
}
if ("last".equals(type)) { // 末文件的处理
strA = "";
bufferedReader.readLine();
bufferedReader.readLine(); // 执行两次,已读取并丢弃了前两行。
while ((strA = bufferedReader.readLine()) != null) { // 开始循环读
readString = strA + LINE_SEPARATOR; // 输出
outputStreamWriter.write(readString);
outputStreamWriter.flush();
}
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) {// 避免第一行空行
outputStreamWriter.write(readString);
outputStreamWriter.flush();
}
i++;
}
handleResult = true;
}
} catch (IOException e) {e.printStackTrace();} // 关闭
finally {
if (fileOutputStream != null) {
try {fileOutputStream.close();} catch (Exception e) {e.printStackTrace();}
}
if (outputStreamWriter != null) {
try {outputStreamWriter.close();} catch (Exception e) {e.printStackTrace();
}
}
}
return handleResult;
} public static void main(String[] args) throws Exception{
System.out.println("开始");
Set<String> ssss = new LinkedHashSet<String>();
ssss.add("E:\\111\\xmlTest\\a.xml");
ssss.add("E:\\111\\xmlTest\\b.xml");
ssss.add("E:\\111\\xmlTest\\c.xml");
MergeFileByStream st = new MergeFileByStream();
st.mergeFiles("E:\\111\\xmlTest\\stream2.xml", ssss);
System.out.println("结束");
}
}

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

  1. java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  2. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

  3. Stream流的读取使用

    这个是在现在的项目里,用到的知识点,一般用不到这些..所以想着还是记下来以后用. 针对文本流 //StreamReader sr = new StreamReader(mystream,Encodin ...

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

    有时候服务运行的日志文件,需要统计分析,但数据量很大,并且直接在文件中看很不直观,这时可以将文件中的内容导入到数据库,入库后的数据就可以按照需求进行统计分析了. 这个是以服务器的访问日志作为示例,一个 ...

  5. C# 中的Stream流

    流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供: 流其实是一种信息的转换,是有序的,有输入和输出流(IO); 1.FileStream 文件流,读取和保存文件操作使用: //写 ...

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

    在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...

  7. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

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

    总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取- ...

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

    1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...

随机推荐

  1. 公共控件Listview

    ListView属性中,Items是行的总集合,Items集合中的每一个是一行,Items集合里面有ListViewItem集合,这个集合实例化:ListViewItem li=new ListVie ...

  2. join(添加字符)与id显示

    #!/usr/bin/env python li = ["alex",'sb'] l1 = "_".join(li) print(l1) print(id(li ...

  3. WINCE6.0组件选择说明

    WINCE6.0组件选择说明 图1 RAS/PPP组件前面的√标识表示我们手动选择,TAPI2.0前面的■标识表示选组件时根据依赖关系自动选择的,PPPoE前面的□标识组件没有选择.

  4. BZOJ 2658 小蓝的好友

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658 题意:给出一个n*m的格子.某些格子中有障碍.求包含至少一个障碍的矩形有多少 ...

  5. CoreData 与 SQLite 比较

    CoreData.framework : iOS中提供了对原始SQLite数据库API访问的封装,通过这个framework来管理数据缓存和持久数据要比使用SQL语句操作SQLite数据库简单和方便许 ...

  6. WEB前端开发工具的初识

    准备学习BootStrap,然后发现好多插件啊…… 从一个开源项目开始学习吧. required node.js & bower & grunt $ git clone https:/ ...

  7. C# WPF MVVM 实战 – 4 - 善用 IValueConverter

    IValueConverter,做 WPF 的都应该接触过,把值换成 Visibility .Margin 等等是最常见的例子,也有很多很好的博文解释过用法.本文只是解释一下,MVVM 中一些情景. ...

  8. hdu 1874(Dijkstra + Floyd)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  9. python_way day12 RabbitMQ ,pymysql

    python_way day12 1.RabbitMQ 2.pymysql RabbitMQ 1.基本用法 """ producer """ ...

  10. jQuery实现的简单文字提示效果模拟title(转)

    来源 http://www.cnblogs.com/puzi0315/archive/2012/10/17/2727693.html 模拟title实现效果,可以修改文字的样式,换行等. 文件下载: ...