zoukankan      html  css  js  c++  java
  • java 中String与StringBuilder 效率

    之前印象中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("
    ", "") );
              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("
    ");
    
    			}
    			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("
    ", "") + 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 + "
    ";
    
    			}
    			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();
        }
      }


  • 相关阅读:
    vs c++ 自动生成svn版本信息 编译前脚本
    cannot seek value-initialized vector iterator 程序崩溃
    shell 统计代码行数
    c++ 控制台程序增加图标的一种方法
    grpc c++ 设置断线重连时间
    拓端数据tecdat|R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据
    拓端数据tecdat|R语言计量经济学:虚拟变量(哑变量)在线性回归模型中的应用
    拓端数据tecdat|Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)
    拓端数据tecdat|R语言用相关网络图可视化分析汽车配置和饮酒习惯
    拓端数据tecdat|R语言 PCA(主成分分析),CA(对应分析)夫妻职业差异和马赛克图可视化
  • 原文地址:https://www.cnblogs.com/vvch/p/4027565.html
Copyright © 2011-2022 走看看