java动态检测指定路径下的批量源文件+python调用jar包获得结果

一、获得批量源文件

完整源代码

package compile;

 
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
 
//操作查找文件的类
public class TextSearchFile {
    static int countFiles = 0;// 声明统计文件个数的变量
    static int countFolders = 0;// 声明统计文件夹的变量
    static String error;
 
    public static File[] searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
 
        File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
            @Override
            public boolean accept(File pathname) {// 实现FileFilter类的accept方法
                if (pathname.isFile())// 如果是文件
                	
                    countFiles++;
                else
                	
                    // 如果是目录
                    countFolders++;
                
                if (pathname.isDirectory()
                        || (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())))// 目录或文件包含关键字
                   
                	return true;
                
                return false;
            }
        });
 
        List<File> result = new ArrayList<File>();// 声明一个集合
        for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件
        	
            if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中
            	
                result.add(subFolders[i]);
                
            } else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
                File[] foldResult = searchFile(subFolders[i], keyWord);
                
                for (int j = 0; j < foldResult.length; j++) {// 循环显示文件
                	
                    result.add(foldResult[j]);// 文件保存到集合中
                    
                }
            }
        }
 
        File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度
        
        result.toArray(files);// 集合数组化
        
        return files;
    }
    
    public static String[] search_java_file() {
    	
    	System.out.print("请输入java项目路径:");
    	
    	Scanner input=new Scanner(System.in);
    	
    	String file_path=input.next();
    	
        File folder = new File(file_path);// 默认目录
        
        String keyword = ".java";
        
        if (!folder.exists()) {// 如果文件夹不存在
        	
            System.out.println("目录不存在:" + folder.getAbsolutePath());
            
            return null;
            
        }
        
        File[] result = searchFile(folder, keyword);// 调用方法获得文件数组
        
        if(result.length == 0) {
        	
        	System.out.println("在 " + folder + " 以及所有子文件时查找对象" + keyword);
        	
        	System.out.println("查找了" + countFiles + " 个文件," + countFolders + " 个文件夹,共找到 " + result.length + " 个符合条件的文件");
        
        }
        
        String src [] = new String[result.length];
        
        for (int i = 0; i < result.length; i++) {// 循环显示文件
        	
            File file = result[i];
            
            src[i] = new String(file.getAbsolutePath());//将文件绝对路径转换为字符串并保存
            
//            System.out.println(src[i]);// 显示文件绝对路径
                         		                        
        }
        
        return src;
    	
    }
 
    public static void main(String[] args) {// java程序的主入口处
    	
    
         error = CompileMain.compile(TextSearchFile.search_java_file());
        
    }
}

二、编译批量源代码

1.关键的编译函数

int result = compiler.run(null, null, error, src);
//函数参数
int run(InputStream in, OutputStream out, OutputStream err, String... arguments);

这个函数有四个参数:
第一个参数:为java编译器提供参数
第二个参数:得到java编译器的输出信息
第三个参数:接收编译器的错误信息
第四个参数:可变参数(是一个String数组)能传入一个或多个Java源文件
返回值:0扁食编译成功,非0表示编译失败
    

2.完整源代码

package compile;
//CompileMain.java
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
 
public class CompileMain {
	
	
	public static String compile(String []src) {
		 
				JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
	       
	        	ByteArrayOutputStream error = new ByteArrayOutputStream();
	        	
	        	int result = compiler.run(null, null, error, src);
	        	
	        	System.out.println(result == 0 ? "编译成功" : "编译失败");
	        	
	        	String error_result =new String(error.toByteArray());
	        	
	        	if(!error_result.equals(null)) { 
	        		
	        		System.out.println(error_result);
	        		
	        		return error_result;
	        		
	        	}
	        		
	        		System.out.println("是否删除编译成功后的.class文件?(Y/N)");
	        		
	        		Scanner input=new Scanner(System.in);
	            	
	            	String answer=input.next();
	            	
	            	if(answer.equals("Y")||answer.equals("y")) {
	        		//编译成功,看是否删除.class文件
	            		for(int i = 0;i<src.length;i++) {
	        			
	            			String file_name = src[i].substring(0, src[i].length()-5);
	        			
	            			String class_path = file_name + ".class";
	        			
	            			File file_class = new File(class_path);
	        			
	            			file_class.delete();
	            			
	            		}
	            	}
	        		return "0错误";
	        	       	
		}
 
    public static void main(String[] args) throws IOException  {
    	
    	JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    	
    	String src [] = {"C:\\Users\\lenovo\\Desktop\\Test.java"};
    	
    	CompileMain.compile(src);
       
    }
}

3.遇到的问题

可能会出现报错如下:

Exception in thread "main" java.lang.NullPointerException

报这个错的原因是编译所需的tools.jar并不在jre中,而是在jdk安装目录下,因此需要将jre改成jdk

4.解决的方式

打开对应项目的properties,选择Java Build Path
在这里插入图片描述
点击JRE,然后点击Edit
在这里插入图片描述
点击Installed JREs ,然后点击Add,Next
在这里插入图片描述
点击Directory,选择jdk导入,然后回到前面选择之前导入的jdk就可以了
在这里插入图片描述

三、python调用jar包

1.中文乱码

之前已经尝试过调用简单的jar包进行测试了,但是这次调用的时候遇到了中文乱码的问题,后面经过测试发现是python中的print函数的问题

import locale
print(locale.getdefaultlocale())

结果:
('zh_CN', 'cp936')

2.解决方法

参考文章:https://www.cnblogs.com/reconova-56/p/12629498.html
在startJVM方法中加入参数"-Dfile.encoding=UTF8"即可

if not jpype.isJVMStarted():

   jpype.startJVM(jvmPath, "-Dfile.encoding=UTF8", "-ea", "-Djava.class.path=%s" % ext_classpath)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值