日期:2014-05-16  浏览次数:20611 次

JAVA数据统计文件的导出和导入、数据库一键备份还原。
        看标题感觉像是两个完全不同的东西,为什么要写到一起呢,虽然说功能流程来说完全不同,但是所用的技术好像是可以互通的。

    先说导出,导出也有几种情况,导出CSV和导出excel,导出excel以前写过,这里只贴出地址,

        http://yuelangyc.iteye.com/admin/blogs/1097336。导出格式为CSV的其实也很简单,

        可以用单纯的IO操作完成, 然后拼接成固定格式,再进行处理写入文件即可,

        CSV是一种以逗号分割的文本文件。也是一种常用的导出格式,可以用Excel工具打开。

        下面贴出自己写的简单的代码:
	/**
	 * List导出为csv格式
	 * @param arrayList 
	 * @param file 已经创建好的file文件
	 * @throws Exception
	 */
	private void exportFile(List<String[]> arrayList,File file) throws Exception{
		
		OutputStream out = new FileOutputStream(file,true);
		for(String [] arr:arrayList){
			for(int i = 0 ; i < arr.length ; i ++){
				
				out.write(arr[i]==null?"".getBytes():arr[i].getBytes());
				if(i<arr.length-1)out.write(",".getBytes());
			}
			out.write('\r'); // \r\n表示换行
			out.write('\n'); 
		}
		out.close();
		
	}


        导出的数据格式是固定的,所以也就有利于后面的导入数据恢复。

         如果是B/S的导出,类似下载那种的,可以将List<String []>拼凑好格式后放进response中,然后响应给客户,让客户进行文件保存操作。

	 public static void ExportCsv(String fileName,List<String[]> list,HttpServletResponse response){
		  PrintWriter out = null; 
		  CSVWriter writer = null;
		  
		  List<String[]> lines = new ArrayList<String[]>();
		  lines.addAll(list);
		  try{
			  response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("gb2312"), "iso8859-1") + ".csv" + "\"");
			  response.setCharacterEncoding("Gb2312");
			  response.setContentType("text/plain;charset=Gb2312");
			  out = response.getWriter();
			  writer = new CSVWriter(out);
			  writer.writeAll(lines);
			  writer.flush();
		  }catch (IOException e){   
	         	 error_logger.error("CsvExport.ExportCsv() error!",e);
	      } catch (Exception e){   
	        	 error_logger.error("CsvExport.ExportCsv() error!",e);
		  }finally{
			  try{
				  writer.close();
				  out.close();
			  }catch(Exception ex){}

		  }
	 }

        js中发送导出请求时直接document.location.href=url+"export.action?param=param"即可。
    
         数据库一键备份还有一种实现方式,我只在window XP上测试过,可以使用的,linux上不知道是不是可行。

        直接贴代码吧。
         /*
          * 一键备份指定表
	 * @deprecated
	 * @return 
	 */
    public String backupTable_old(){

    	//存放备份文件的路径 
        String backup_path = getProps("backup_file_path");
    	
    	//配置文件中获取数据库连接信息
        String user_name = getProps("user_name"); 
        String user_psw = getProps("user_psw"); 
        String db_name = getProps("db_name"); 
        String host_ip = getProps("host_ip"); 
        
		//获取文件保存备份路径,如果不存在,则先创建目录
        String saveFileDir=backup_path + ab + "/";
		File dir=new File(saveFileDir);
		if(!dir.exists())dir.mkdirs();
		
    	backup_path = saveFileDir + "backup_"+ab+"_"+dataFormat.format(new Date())+".sql";
    	
    	//需要备份的表,目前为已定义好的表
    	String tableClass = TB_CLASS + ab;
    	String tableClassUser = TB_CLASS_USER + ab;
    	String black = " ";
    	String allTable = black + tableClass + black + tableClassUser;
    	
    	StringBuffer sb = new StringBuffer();

    	
    	//拼接字符串,mysqldump命令。
    	sb.append("mysqldump").append(" -h ").append(host_ip).append(" -u ").append(user_name)
    	.append(" -p").append(user_psw).append(black).append(db_name).append(" --add-drop-table")
    	.append(" -t ").append(allTable).append("  --result-file=").append(backup_path);

    	String dumpSQL = sb.toString();
    	System.out.println(dumpS