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("结束");
}
}

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

  1. stream流批量读取并合并文件

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

  2. Java之Stream流

    Stream流的初步学习 初次学习Stream流的学习笔记,学习之前先了解一下函数式接口 概述 API是一个程序向使用者提供的一些方法,通过这些方法就能实现某些功能.所以对于流API来 说,重点是怎么 ...

  3. Java 之 Stream 流

    Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端 一.传统遍历 1.传统集合的多步遍历代码 几乎所有的集合(如 ...

  4. Java 8 Stream流编程学习

    本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...

  5. 【重学Java】Stream流

    Stream流 体验Stream流[理解] 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把&q ...

  6. Java的Stream流

    yi.控制台输入输出流, 1.读取控制台输入 Java的控制台输入由System.in完成.为了获得一个绑定到控制台的字符流,可以把System.in包装在一个BufferedReader对象中来创建 ...

  7. 简洁方便的集合处理——Java 8 stream流

    背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表 ...

  8. Java的Stream流式操作

    前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...

  9. Java基础 | Stream流原理与用法总结

    Stream简化元素计算: 一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream: ...

随机推荐

  1. 10个CSS简写技巧

    CSS简写就是指将多行的CSS属性声明化成一行,又称为css代码优化.CSS简写的最大好处就是能够显著减少CSS文件的大小,其实还有很多其他益处.臃肿而杂乱的CSS样式表会使你遇到问题是难以调试.尤其 ...

  2. ES6 学习 -- Promise对象

    1.promise含义:可以将promise对象看成是一个容器,它保存着未来才会结束的某个事件(一般是异步操作事件)的结果,各 种异步操作都可以用promise对象来处理promise的特点:(1)p ...

  3. Visual Studio Git代码管理环境部署

    Visual Studio 2010 部署Git代码管理环境. 第一:首先做Git的安装和环境部署 1.下载并安装Git软件,在windows环境下的Git叫做“msysGit”,官网地址为https ...

  4. 【学术篇】一些水的不行的dp

    最近做了几道非常水非常水的dp...... 之后刷的一些水dp也会写在这里...... 此篇题目难度不递增!!! Emmmm....... 1.luogu1043数字游戏 以前看过这个题几遍,没做这个 ...

  5. 【JZOJ6273】欠钱

    description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...

  6. python相关软件安装流程图解——MySQL 8.0.13安装教程(windows 64位)——MYSQL依赖的软件——MYSQL必须的系统DLL插件——MYSQL真正的安装

    https://www.mysql.com/https://www.mysql.com/downloads/https://dev.mysql.com/downloads/windows/https: ...

  7. hadoop高可用HA的配置

    zk3 zk4 zk5 配置hadoop的HA大概可以分为以下几步: 配置zookpeer(namenode之间的通信要靠zk来实现) 配置hadoop的 hadoop-env.sh hdfs-sit ...

  8. hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对

    题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...

  9. thinkphp一键清除缓存的方法

    后台控制器: <?php namespace Home\Controller; use Think\Controller; class HuancuController extends Cont ...

  10. 命令学习_nslookup

    nslookup 域名 这是最常用最简单的用法,可以直接获得目标域名的IP地址和CNAME. 如下是A记录的返回情况 nslookup命令会采用先反向解释获得使用的DNS服务器的名称,上图中ns.gu ...