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: ...
随机推荐
- 14-MySQL-Ubuntu-数据表的查询-范围查询(三)
范围查询 1,不连续查询-in, not in 查询年龄是12,18,34的学生姓名和年龄信息 select name,age from students where age in (12,18,34 ...
- Area in Triangle /// oj10229
题目大意: 给出三角形的三个顶点 再给一条绳(绳长不超过三角形周长) 求绳子在三角形中能围出的最大面积 题解链接 http://blog.sina.com.cn/s/blog_6a46cc3f0100 ...
- USACO2012 Broken necklace /// DP oj10103
题目大意: 项链最长的纯色连续段,“w”即white白色珠子,可任意涂为红或蓝,“r” “b”即红 蓝. Input Line 1: N, the number of beads Line 2: ...
- javascript字符串方法学习汇总
1.charAt(index) charAt(index):返回字符串中指定位置的字符 var str = 'abcdefghi'; console.log(str.charAt()); // 输出 ...
- 配置Spring Security 错误:Property or field 'ROLE_USER' cannot be found
在学习http://www.mkyong.com/spring-security/spring-security-hello-world-example/时,出现以下错误: Property or f ...
- Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR tensorflow-1.13.1和1.14windows版本目前不支持CUDA10.0
报错出现 Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR tensorflow-1.13.1和1.14windows版本目前不支持 ...
- yolo3使用darknet卷积神经网络训练pascal voc
darknet本来最开始学的是https://github.com/pjreddie/darknet yolo3作者自己开发的,但是它很久不更新了而且mAP值不好观察,于是另外有个https://gi ...
- shell 命令 进程相关
1. 进程标识号PID 唯一性 pid 为0 内核进程,linux内核创建 pid 为1 init进程,系统最早创建的进程,init是所有用户进程的祖先 2. 查看系统进程信息 (1)[ ...
- MySQL数据库之DQL(数据查询语言)
1.MySQL之DQL查询AS CONCAT LIKE的使用 (1)select 列名1,列名2,...... from 表名 [where 条件] 查询所有字段用*,不带where条件的话,就会把表 ...
- CSIC_716_20191109【函数的语法,以及函数的分类,可变长参数*args】
函数 定义.作用.及使用方式 函数是一种工具,可以被重复调用. 使用函数可精简重复代码,减少冗余,增加代码的可读性. 函数要先构造函数,然后调用函数. 构造及调用函数的语法结构 关键字def 函数名 ...