[Java实战]增量源码工具类_老大帮忙写的

package com.taihe.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * 增量源码包生产类
 * @author lee
 */
public class GeneratePatchUtilV3 {
	
	//增量文件set
	private static Set<String> PATCH_SET = new HashSet<String>();
	
	//源文件根目录(根据实际修改)
	private static String SOURCE_PATH = "C:\\xiangmu";
	
	//目标文件根目录(根据实际修改)
	private static String TARGET_PATH = "D:\\Project\\patch\\";
	
	//增量文件配置文件
	private static String PATCH_FILE_NAME = "patch.txt";
	
	//增量文件总数
	private static int PATCH_COUNT = 0;
	 
	public static void main(String[] args) {
		buildPatchCode();
	}
	
	/**
	 * 生成增量源码
	 */
	public static void buildPatchCode(){
		
		 TARGET_PATH += getTargetDirName(); 
		
		 System.out.println("源码路径:" + SOURCE_PATH);
		 System.out.println("目标路径:" + TARGET_PATH);
		 
	     try {
	    	 //读取增量文件txt
	    	 readPatchFiles();
	    	 
	    	 //拷贝增量文件到目标目录
	    	 System.out.println("---------- 开始拷贝增量文件 ----------");
	    	 for(String patchFile : PATCH_SET){
	    		 String srcFileName = SOURCE_PATH + File.separator + patchFile;
	    		 String targetFileName = TARGET_PATH + File.separator + patchFile;
	    	     File srcFile = new File(srcFileName); //根据一个路径得到File对象  
	    	     //判断源文件是否存在  
	    	     if(srcFile.exists()){  
	    	    	 //检查如果是文件夹则执行文件夹拷贝
	    	    	 if(srcFile.isDirectory()){
	    	    		 copyDir(srcFileName, targetFileName);
	    	    	 }
	    	    	 else//非文件夹按照文件执行拷贝
	    	    	 {
	    	    		 copyFile(srcFileName, targetFileName,true);
	    	    	 }
	    	     }else{
	    	    	 System.out.println("不存在:" + srcFile.getPath());
	    	     }
	    	 }
	    	 System.out.println("---------- 结束拷贝增量文件 ----------");
	    	 System.out.println("增量文件数量:" + PATCH_COUNT);
	    	 
	     } catch (Exception e) {
	    	 e.printStackTrace();
	     }
	}
	
	
	/**
	  * 获取目标目录名称
	  * @return 目录名称
	  */
	 private static String getTargetDirName(){
		 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//设置日期格式
        String now = df.format(new Date());
        
		 String dirName = "ekp_v3_"+now;
		 
		 return dirName;
	 }
	 
	
	/**
	 * 读取增量文件txt
	 */
	public static void readPatchFiles(){
		/* 读取数据 */
	     try {
	    	 
	    	 System.out.println("---------- 开始读取增量文件 ----------");
	    	 
	    	 PATCH_SET.clear();
	    	 
	         BufferedReader br = new BufferedReader(new InputStreamReader(GeneratePatchUtilV3.class.getClassLoader().getResourceAsStream(PATCH_FILE_NAME), "UTF-8"));
	         String lineTxt = null;
	         while ((lineTxt = br.readLine()) != null) {
	             if(lineTxt!=null && lineTxt.trim().length() > 0){
	            	if(lineTxt.startsWith("/")){
	            		 System.out.println("已读取:"+lineTxt);
		            	 PATCH_SET.add(lineTxt.trim());
	            	}else {
	            		 System.out.println(lineTxt);
	            	}
	             }else{
	            	 System.out.println(lineTxt);
	             }
	         }
	         br.close();
	     } catch (Exception e) {
	         System.err.println("read errors :" + e);
	     }
	}
	
	
	/**
	 * 拷贝文件
	 * @param srcFileName 源文件全路径名称
	 * @param targetFileName 目标文件全路径名称
	 * @param overlay 若已存在是否覆盖
	 * @return 拷贝结果
	 */
	public static boolean copyFile(String srcFileName,String targetFileName,boolean overlay){  
		 File srcFile = new File(srcFileName); //根据一个路径得到File对象  
	     //判断源文件是否存在  
	     if(!srcFile.exists()){  
	         try{  
	             throw new Exception("源文件:"+srcFileName+"不存在!");  
	         }catch(Exception e){  
	             e.printStackTrace();//将异常内容存到日志文件中  
	         }  
	         return false;  
	     }else if(!srcFile.isFile()){//判断是不是一个文件  
	         try {  
	             throw new Exception("复制文件失败,源文件:"+srcFileName+"不是一个文件!");  
	         } catch (Exception e) {  
	           
	             e.printStackTrace();  
	         }  
	         return false;  
	           
	     }  
	     //判断目标文件是否存在  
	     File destFile = new File(targetFileName);//目标文件对象destFile  
	     if(destFile.exists()){  
	         //如果目标文件存在并允许覆盖  
	         if(overlay){  
	             //删除已经存在的目标文件  
	             new File(targetFileName).delete();  
	         }  
	         System.out.println("已覆盖:"+destFile.getPath());
	     }else{  
	    	 System.out.println("已复制:"+destFile.getPath());
	         //如果目标文件所在目录不存在,则创建 目录  
	         if(!destFile.getParentFile().exists()){  
	             //目标文件所在目录不存在  
	             //mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录  
	             if(!destFile.getParentFile().mkdirs()){  
	                 //复制文件失败:创建目标文件所在目录失败  
	                 return false;  
	             }  
	         }  
	     }  
	       
	     
	     //增量文件数量递增
	     PATCH_COUNT++;
	     
	     //复制文件  
	     int byteread = 0;//读取的字节数  
	     InputStream  in = null;  
	     OutputStream  out = null;  
	       
	     try {  
	         in  = new FileInputStream(srcFile);  
	         out = new FileOutputStream(destFile);  
	         byte[] buffer = new byte[1024];  
	         /* 
	          * 方法说明: 
	          * ①:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 
	          *      write(byte[] b, int off, int len)  
	          *          b - 数据 
	          *          off - 数据中的起始偏移量。 
	          *          len - 要写入的字节数。  
	          * ②:in.read(buffer))!=-1,是从流buffer中读取一个字节,当流结束的时候read返回-1 
	          */  
	         while((byteread = in.read(buffer))!=-1){  
	             out.write(buffer, 0, byteread);  
	         }  
	         return true;  
	     } catch (FileNotFoundException e) {  
	           
	         return false;  
	     } catch (IOException e) {  
	         return false;  
	     }finally{  
	         try {  
	             if(out!=null){  
	                 out.close();  
	             }  
	             if(in!=null){  
	                 in.close();  
	             }  
	         } catch (IOException e) {  
	               
	             e.printStackTrace();  
	         }  
	     }  
	 }
	
	 public static void copyDir(String sourceFileName, String targetFileName) throws IOException {
		File srcFile = new File(sourceFileName);
        String[] subFilePath = srcFile.list();
        if (!(new File(targetFileName)).exists()) {
            (new File(targetFileName)).mkdir();
        }
        
        for (int i = 0; i < subFilePath.length; i++) {
        	String  subFile = subFilePath[i];
            if ((new File(sourceFileName + File.separator + subFile)).isDirectory()) {
                copyDir(sourceFileName  + File.separator  + subFile, targetFileName  + File.separator + subFile);
            }
            if (new File(sourceFileName  + File.separator + subFile).isFile()) {
                copyFile(sourceFileName + File.separator + subFile, targetFileName + File.separator + subFile,true);
            }
        }
    }
}

根目录src下写一个patch.txt

内容如下

#增量文件夹
/WebContent/resource/
#增量js
/WebContent/resource/test.js
#增量jsp
/WebContent/resource/test.jsp
#增量java
/src/Test.java

右键运行run as java appapplication 即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 协同过滤是推荐系统中经典的算法之一,主要思想是基于用户对物品的评分数据,计算用户之间的相似度,进而预测用户对未评分物品的评分。在实际应用中,需要使用工具类来快速地实现协同过滤算法并进行推荐。 Java语言拥有丰富的开源工具包,如Mahout、Lenskit等,可以实现协同过滤算法。其中Mahout是基于Hadoop的大数据框架实现的,可以处理海量的数据;而Lenskit是基于Java语言的轻量级工具包,适合小型数据集的处理。 使用Java实现协同过滤算法工具类,需要考虑以下几个方面: 1、数据源的读取:可以将数据存储在关系型数据库或NoSQL数据库中,通过读取数据源获取评分数据。 2、相似度算法的实现:常用的相似度算法包括余弦相似度、皮尔逊相关系数和欧几里得距离等,需要实现这些算法并计算用户之间的相似度。 3、推荐结果的生成:根据用户评分数据和用户相似度,可以预测用户对未评分物品的评分,从而生成推荐结果。 4、性能优化:协同过滤算法的计算复杂度较高,需要对算法进行优化,如增量计算、分布式计算等。 总之,实现协同过滤推荐算法工具类需要兼顾实用性和性能,Java语言的开源工具包可以提供参考和借鉴。 ### 回答2: Java协同过滤推荐算法工具类提供了实现协同过滤推荐算法的方法和工具。协同过滤是一种常见的推荐算法,它通过分析用户历史行为和用户之间的相似度来预测用户可能感兴趣的物品。Java协同过滤推荐算法工具类可以帮助开发者快速构建推荐系统,提高开发效率。 Java协同过滤推荐算法工具类包含了协同过滤算法的核心实现,支持基于用户和基于物品的推荐。除了实现算法外,该工具类还提供了数据的加载、模型保存和加载等功能,方便用户在实际应用中使用。同时,Java协同过滤推荐算法工具类还支持多种评估方法,包括均方根误差(RMSE)、平均绝对误差(MAE)等,帮助用户评估推荐系统的性能。 Java协同过滤推荐算法工具类主要基于Java平台,可以在大部分Java开发环境下使用,例如Eclipse、IDEA等。此外,该工具类还提供了一些示例代码,方便开发者了解如何使用算法模型,快速上手。 总之,Java协同过滤推荐算法工具类是一款实用、高效的推荐算法工具,提供了完备的算法实现和评估方法,可以帮助开发者快速构建推荐系统,为用户提供更好的个性化推荐服务。 ### 回答3: Java协同过滤推荐算法工具类是一种用于开发推荐系统的软件工具,旨在提供一套方便、可靠、高效的函数和类库,以便开发人员快速构建、训练和测试协同过滤推荐模型和算法。 该工具类通常会提供一些常见的协同过滤算法和技术,如基于用户相似度或物品相似度的协同过滤算法、基于矩阵分解的协同过滤算法、基于内容的推荐算法等,而且这些算法通常都是高度优化的,能够处理大量的数据集和变化频繁的数据流。 此外,Java协同过滤推荐算法工具类还提供了一些可视化和分析工具,以帮助开发人员更好地理解、调试和优化算法模型,如可视化相似度矩阵、错误率分析工具、预测结果可视化等。 总之,Java协同过滤推荐算法工具类是一种非常有用的工具,不仅可以大幅提高推荐系统的开发效率和质量,还能为开发人员提供更多的创造力和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值