stream流批量读取并合并文件
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流批量读取并合并文件的更多相关文章
- java使用stream流批量读取并合并文件,避免File相关类导致单文件过大造成的内存溢出。
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?
重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...
- Stream流的读取使用
这个是在现在的项目里,用到的知识点,一般用不到这些..所以想着还是记下来以后用. 针对文本流 //StreamReader sr = new StreamReader(mystream,Encodin ...
- java批量读取多个文件并存入数据库
有时候服务运行的日志文件,需要统计分析,但数据量很大,并且直接在文件中看很不直观,这时可以将文件中的内容导入到数据库,入库后的数据就可以按照需求进行统计分析了. 这个是以服务器的访问日志作为示例,一个 ...
- C# 中的Stream流
流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供: 流其实是一种信息的转换,是有序的,有输入和输出流(IO); 1.FileStream 文件流,读取和保存文件操作使用: //写 ...
- ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...
- python 作业 批量读取excel文件并合并为一张excel
1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...
- java mysql大数据量批量插入与流式读取分析
总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取- ...
- Java中的文件和stream流的操作代码
1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...
随机推荐
- 改变HTML
改变HTML 1.改变HTML输出流 JavaScript可以创建动态的HTML内容.(注意:不要在加载文档后使用document.write(),这会覆盖文档.) <%@ page langu ...
- (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。
package lianxi; public class Cat { String Name, Color; int Age; void getName() { System.out.println( ...
- Block很简单,就像delegate的简化版
代理设计模式对于iOS开发的人来说肯定很熟悉了,代理delegate就是委托另一个对象来帮忙完成一件事情,为什么要委托别人来做呢,这其实是MVC设计模式中的模块分工问题,例如View对象它只负责显示界 ...
- 【Unity3D游戏开发】Application.systemLanguage无法区分简体中文和繁体中文 (二六)
游戏发布,语言本地化需要繁体中文和简体中文 iOS8版本之前没问题,iOS9上无法正常识别这两种语言 原因是在iOS9上,Unity通过Application.systemLanguage返回的简体中 ...
- dev RichText高亮
需要引用的DLL DevExpress.CodeParser DevExpress.Office DevExpress.RichEdit DevExpress.XtraRichEdit MySyn ...
- 用ubuntu下载电影:磁力链接,torrent,迅雷链接
用ubuntu下载电影:磁力链接,torrent,迅雷链接 操作系统:Ubuntu 14.04 64位 需要软件:Ktorent, Amule 安装软件: sudo apt-get install k ...
- [51NOD1095] Anigram单词(map)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1095 字典的单词在map中排序和不排序各存1次,查的时候相减. ...
- java web开发必备知识
从各种招聘网站的要求上筛选出了一些java开发的一些基本的要求,对照自身看看有哪些缺陷. java基础 既然是java web开发,java SE肯定要学好了. 多线程,IO,集合等,对队列,缓存,消 ...
- 指令随笔之:tail、cat、scp、&、&&、;、|、>、>>
tail(中文意思是跟踪) tail默认只看文件的最后10行内容,cat则一次显示全部内容 ping 192.168.120.204 > zyx.log & # &表 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...