java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。
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相关类导致单文件过大造成的内存溢出。的更多相关文章
- stream流批量读取并合并文件
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- Java之Stream流
Stream流的初步学习 初次学习Stream流的学习笔记,学习之前先了解一下函数式接口 概述 API是一个程序向使用者提供的一些方法,通过这些方法就能实现某些功能.所以对于流API来 说,重点是怎么 ...
- Java 之 Stream 流
Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端 一.传统遍历 1.传统集合的多步遍历代码 几乎所有的集合(如 ...
- Java 8 Stream流编程学习
本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...
- 【重学Java】Stream流
Stream流 体验Stream流[理解] 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把&q ...
- Java的Stream流
yi.控制台输入输出流, 1.读取控制台输入 Java的控制台输入由System.in完成.为了获得一个绑定到控制台的字符流,可以把System.in包装在一个BufferedReader对象中来创建 ...
- 简洁方便的集合处理——Java 8 stream流
背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表 ...
- Java的Stream流式操作
前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...
- Java基础 | Stream流原理与用法总结
Stream简化元素计算: 一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream: ...
随机推荐
- jQuery Ajax请求 .net 一般处理程序
初学ajax 一个简单的功能,调试了2个小时,代码如下虽然成功了 但是有错误 <!DOCTYPE html> <html> <head> <meta http ...
- USACO2007 捕牛记 /// queue+桶 oj1503
题目大意: John和牛都站在一条直线上,开始时John位于坐标点N上( 0 ≤ N ≤ 100,000 ),牛位于坐标点K上( 0 ≤ K ≤ 100,000 ). John有两种行动方式:步行和瞬 ...
- PostgreSQL 主键自动增长
建立主键并设置自动增加的办法好好几种,这里记录我测试过的: drop table pro_process; CREATE TABLE "public"."pro_proc ...
- 再次封装ajax函数,统一入口
根据API写网页的时候,每个页面都需要ajax请求,每次都写一大堆请求,配置什么的太麻烦,于是打算封装一个ajax函数,统一调用: 开始时是使用return返回ajax,如下: function cr ...
- NLP杂点
1.停用词 stop words: 在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词. 停用词都是人工输入.或者由一个停用词表导入. 2.jieba是目前最好的 Python 中文分词组件 ...
- gradle 随记
gradle项目下添加jar包 compile fileTree(dir: './src/main/resources/lib', include: '*.jar') 将jar包放到这个目录下./sr ...
- 【JZOJ6389】小w学图论
description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节 ...
- 【JZOJ6271】锻造 (forging)
description analysis 首先看一下\(p=1\),即\(1\)以后的合成一定成功的情况 如果按照求期望值的一般做法求两把\(0\)合成\(1\)的期望,会画出一棵无穷大的树 这个的期 ...
- (转)Android中px与dip,sp与dip等的转换工具类
功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方法中的参数请参考http://www.cnblogs.co ...
- python3爬虫lxml模块的安装
1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...