之前印象中string与stringbuilder操作时,如果多次改变string就使用stringbuilder,效率会提高;

今天实际遇到了问题,亲身经历过之后,这性能不是一般的影响啊;不是同一个数量级的;

场景描述:

一个包含50719条记录的excel文件,读取其中的内容,通过逗号分隔的方式拼接成字符串;

如果使用string要耗时三四十分钟;有可能更长,并且耗费更多的内存;

如果使用stringbuilder只需要几秒钟;有可能更短;

测试代码如下:

使用stringbuilder
/**
* v1.1 excel转txt 输入excel流,返回txt流
* @param ins excel流
* @param filename2 txt临时文件路径
* @param split_char 分割符
* @param Column 总列数
* */
private boolean ExcelToTxt(InputStream ins, String filename2, String split_char, String Column){
boolean flag = false;
Workbook rwb = null;
FileOutputStream fops = null;
Sheet rs = null;
Cell cell = null;
String split_char_real = ",";//实际分隔符
if(split_char!=null && split_char.trim().length()>0){
split_char_real = split_char;
}
//获得文件名
//String filename1 = filename.substring(0,filename.lastIndexOf("."));
//路径+文件名+.txt后缀
//String filename2 = path+"/"+filename1+".txt";
//创建txt临时文件
File newFile = new File(filename2);
try {
//从输入流创建Workbook
rwb = Workbook.getWorkbook(ins);
//获取第一张Sheet表
rs = rwb.getSheet(0);
//获取Sheet表中所包含的总列数
int rsColumns = rs.getColumns();
if(Column!=null && Column.trim().length()>0){
rsColumns = Integer.valueOf(Column);//使用配置的列数
}
//获取Sheet表中所包含的总行数
int rsRows = rs.getRows();
//拼接内容
StringBuilder s = new StringBuilder();
for(int i=0;i<rsRows;i++){ // cell = rs.getCell(0,i);//每行的第一个
// if(cell.getContents().trim().length()==0){//如果第一列为空就结束读取excel
// break;
// }
//判断是否为空行
try {
StringBuilder rowData = new StringBuilder();
for(int j=0;j<rsColumns;j++){
cell = rs.getCell(j,i);
rowData.append(cell.getContents());
}
if (new String(rowData).trim().length() == 0) { //如果为空行,就结束读取excel
break;
}
} catch (Exception e) {
System.out.println("*****DataImport*********** 判断空行出错");
e.printStackTrace();
break;
} for(int j=0;j<rsColumns;j++){
cell = rs.getCell(j,i);
String content = cell.getContents();
s.append(content.replaceAll("\n", "") );
s.append(split_char_real);//支持换行
}
if(s.length()>0) s.delete(s.length()-split_char_real.length(),s.length());//s = s.substring(0,s.length()-split_char_real.length());
//
/*if(s.length()>0 ){
int count = StringUtils.countMatches(s, split_char_real);
//&& s.split(split_char_real).length>0 && s.split(split_char_real).length < rsColumns
s = s + split_char_real+ " ";
}*/
if(s.lastIndexOf(split_char_real) == (s.length() - split_char_real.length())){
s.append(" ");
}
if(i<rsRows-1) s.append("\r\n"); }
System.out.println("--------DataImport---------excel转换生成的txt文件内容:"+newFile.getAbsolutePath());
if(!newFile.exists()){//如果文件不存在,就创建一个新的
newFile.createNewFile();
}
fops = new FileOutputStream(newFile);//使用输出流
fops.write(s.toString().getBytes());//写入文本文件
flag = true;//转换成功
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//操作完成时,关闭对象,释放占用的内存空间
rwb.close();
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return flag; } public static void main(String[] args) {
DataImport di = new DataImport();
try
{
di.ExcelToTxt(new FileInputStream("f:\\团圆行动营销成功客户上传_20140610.xls"), "f:\\2014.txt", ",", "10");
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
使用string
/**
* v1.1 excel转txt 输入excel流,返回txt流
* @param ins excel流
* @param filename2 txt临时文件路径
* @param split_char 分割符
* @param Column 总列数
* */
private boolean ExcelToTxt(InputStream ins, String filename2, String split_char, String Column){
boolean flag = false;
Workbook rwb = null;
FileOutputStream fops = null;
Sheet rs = null;
Cell cell = null;
String split_char_real = ",";//实际分隔符
if(split_char!=null && split_char.trim().length()>0){
split_char_real = split_char;
}
//获得文件名
//String filename1 = filename.substring(0,filename.lastIndexOf("."));
//路径+文件名+.txt后缀
//String filename2 = path+"/"+filename1+".txt";
//创建txt临时文件
File newFile = new File(filename2);
try {
//从输入流创建Workbook
rwb = Workbook.getWorkbook(ins);
//获取第一张Sheet表
rs = rwb.getSheet(0);
//获取Sheet表中所包含的总列数
int rsColumns = rs.getColumns();
if(Column!=null && Column.trim().length()>0){
rsColumns = Integer.valueOf(Column);//使用配置的列数
}
//获取Sheet表中所包含的总行数
int rsRows = rs.getRows();
//拼接内容
String s = "";
for(int i=0;i<rsRows;i++){ // cell = rs.getCell(0,i);//每行的第一个
// if(cell.getContents().trim().length()==0){//如果第一列为空就结束读取excel
// break;
// }
//判断是否为空行
try {
StringBuilder rowData = new StringBuilder();
for(int j=0;j<rsColumns;j++){
cell = rs.getCell(j,i);
rowData.append(cell.getContents());
}
if (new String(rowData).trim().length() == 0) { //如果为空行,就结束读取excel
break;
}
} catch (Exception e) {
System.out.println("*****DataImport*********** 判断空行出错");
e.printStackTrace();
break;
} for(int j=0;j<rsColumns;j++){
cell = rs.getCell(j,i);
String content = cell.getContents();
s = s + content.replaceAll("\n", "") + split_char_real;//支持换行
}
if(s.length()>0) s = s.substring(0,s.length()-split_char_real.length());
//
if(s.length()>0 && s.split(split_char_real).length>0 && s.split(split_char_real).length < rsColumns){
s = s + split_char_real+ " ";
}
if(i<rsRows-1) s = s + "\r\n"; }
System.out.println("--------DataImport---------excel转换生成的txt文件内容:"+s);
if(!newFile.exists()){//如果文件不存在,就创建一个新的
newFile.createNewFile();
}
fops = new FileOutputStream(newFile);//使用输出流
fops.write(s.getBytes());//写入文本文件
flag = true;//转换成功
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//操作完成时,关闭对象,释放占用的内存空间
rwb.close();
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return flag; } public static void main(String[] args) {
DataImport di = new DataImport();
try
{
di.ExcelToTxt(new FileInputStream("f:\\团圆行动营销成功客户上传_20140610.xls"), "f:\\2014.txt", ",", "10");
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

java 中String与StringBuilder 效率的更多相关文章

  1. 探秘Java中String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  2. JAVA中String和StringBuilder类的特点及使用

    转自:https://www.imooc.com/code/2202 仅做个人学习记录之用,侵删! 什么是 Java 中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. Str ...

  3. java中String、StringBuilder、StringBuffer三者的区别

    在Java项目开发中,字符串是最长使用的数据类型,而有关字符串的String.StringBuilder.StringBuffer三者又常常让人分不清楚什么时候该使用哪个. 特此整理一下. Strin ...

  4. Java中String、StringBuilder以及StringBuffer

    原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...

  5. java中String与StringBuilder的区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...

  6. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  7. java中String,StringBuffer,StringBuilder之间的区别

    文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...

  8. Java中String、StringBuilder和StringBuffer

    StringBuilder和StringBuffer内部都是通过char[]来实现的.(jdk1.9后,底层把char 数组变成了byte[].)唯一不同的就是我们的StringBuffer内部操作方 ...

  9. java中String、stringbuilder、stringbuffer区别

    1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的.每次对String对象进行改变的时候其实都等 ...

随机推荐

  1. java多线程编程核心技术(一)--多线程技能

    1.进程和线程的概念 1.进程:进程是操作系统的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位. ...

  2. 夜话JAVA设计模式之策略模式

    策略模式     定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户.设计原则1     找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在 ...

  3. [bzoj1232][Usaco2008Nov]安慰奶牛cheer_Kruskal

    安慰奶牛 cheer bzoj-1232 Usaco-2008 Nov 题目大意:给定一个n个点,m条边的无向图,点有点权,边有边权.FJ从一个点出发,每经过一个点就加上该点点权,每经历一条边就加上该 ...

  4. Redis3.0集群方案分析

    在Redis3.0集群出来之前,大家都对作者antirez寄予厚望,因为Redis从来没有让我们失望过.现在Redis3.0集群出来了,网上出了很多评论文章,都说他的功能多么强大,包括下面这张图是彻底 ...

  5. 编程算法 - 求1+2+...+n(函数继承) 代码(C++)

    求1+2+...+n(函数继承) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whi ...

  6. 深入学习理解java-ThreadLocal

    导读 首先,ThreadLocal 不是用来解决共享对象的多线程訪问问题的,普通情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其它线程是不须要訪问的,也訪问不到 ...

  7. mac关闭和开启启动声

    1 关闭 sudo nvram SystemAudioVolume=%01 2 开启 sudo nvram -d SystemAudioVolume

  8. 初识bigdata时的一些技能小贴士

    既然小豆腐如此给力,而且充分的利用主动学习的优势,已经有了迅速脑补,压倒式的优势,不过这只是表面而已,一切才刚刚开始,究竟鹿死谁手,还有待验证. 以上可以看到,小豆腐为什么拼命的要teach我们了么, ...

  9. 一些SQL高级函数

    一些SQL高级函数 Posted on 2010-08-08 21:34 moss_tan_jun 阅读(311) 评论(0) 编辑 收藏 长度与分析用 datalength(Char_expr) 返 ...

  10. Mybatis 代码自动生成(generatorConfig.xml配置)

    博客推荐: Mybatis最入门---代码自动生成(generatorConfig.xml配置) MyBatis Generator generatorConfig.xml配置详解 pom.xml&l ...