Recent Question

发布时间 2023-03-24 19:35:42作者: 夜色哪里都是美

Java代码调用Python代码

使用ProcessBuilder进行调用

        // 调用再linux和window下情况不同
        if (OS.startsWith("Windows")) {
            // windows执行脚本需要使用 cmd.exe /c 才能正确执行脚本
            ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "python", WINDOWS_PATH + fileName);
            // 设置控制台输出的格式 
            // 注意同时需要设置python代码的控制台输出格式
            Map<String, String> env = processBuilder.environment();
            env.put("PYTHONIOENCODING", "UTF-8");
            process = processBuilder.directory(new File(WINDOWS_PATH)).start();
        } else {
            // linux执行脚本一般是使用python3 + 文件所在路径
            ProcessBuilder processBuilder = new ProcessBuilder("python3", LINUX_PATH + fileName);
            Map<String, String> env = processBuilder.environment();
            env.put("PYTHONIOENCODING", "UTF-8");
            process = processBuilder.directory(new File(LINUX_PATH)).start();
        }

读取执行的输出:

// 脚本执行正常时的输出信息
            BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            List<String> returnString = read(fileName, inputReader);
            logger.info("execSync...... 读取python文件 fileName={}&returnString={}", fileName, returnString);

            // 脚本执行异常时的输出信息
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            List<String> errorString = read(fileName, errorReader);
            logger.info("execSync...... 读取python文件 异常 fileName={}&errorString={}", fileName, errorString);

python程序执行结果:

// 注意调用次方法可能死锁,获取打印信息导致缓冲区满就会造成死锁
process.waitFor();
// 返回0执行正常

参考文档:https://blog.csdn.net/qq_27948659/article/details/80895860

文件上传

// mutipartFile文件上传到服务器
	//读取成byte
    byte[] bytes = file.getBytes();
    // filePath为上传路径
    File dest = new File(filePath);
    if (dest.exists()) {
    	dest.delete();
    }
    // 写入
    fileOutputStream = new FileOutputStream(dest);
    fileOutputStream.write(bytes);

数据库相关

查询一周内的最新的一条数据
时间处理: 有两个字段
	ymd 为具体日期eg:2023-03-24
	sts 为服务器的时间戳
使用ymd进行查询 
注意:使用日期格式时,ymd只有年月日,所以使用CURRENT_DATE();带年月日使用NOW()
SELECT * from table
WHERE ymd >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)
ORDER BY sts DESC limit 1

使用sts进行查询
SELECT * from table
WHERE sts > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 MONTH))*1000
ORDER BY sts DESC limit 1
新增索引

ALTER TABLE table_name ADD INDEX idx_reg_ip (reg_ip);

其中,table_name为需要新增索引的表名,reg_ip为需要新增索引的字段名,idx_reg_ip为索引名称,可以根据实际需要进行命名。

新增字段

ALTER TABLE table_name ADD country varchar(100) DEFAULT '' NULL COMMENT '国家';

具体解释如下:

  • ALTER TABLE table_name:表示修改 table_name 表的结构;
  • ADD country varchar(100):表示添加一个名为 country 的新字段,数据类型为 varchar(100)
  • DEFAULT '':表示设置该字段的默认值为空字符串;
  • NULL:表示该字段允许为空;
  • COMMENT '国家':表示为该字段添加注释,注释内容为 '国家'

JDK8新特性的使用

Collectors.joining方法来实现将List中的数据全部取出来使用逗号拼接

List<String> list = Arrays.asList("A", "B", "C", "D");
String result = list.stream().collect(Collectors.joining(","));

JSON的使用

fastjson -- JSONObject

// String转jsonObject
JSONObject jsonObject = new JSONObject({"show":"false","creative":"xxx"});
//获取creative字段的值
jsonObject.getString("creative");
//移除creative字段
jsonObject.remove("creative");

//获取对应key并转为jsonObject
jsonObject.getJSONObject("key")
//获取对应key的Object
jsonObject.get("key")

//字符串转jsonobject与jsonArray
JSONObject.parseArray(str);
JSONObject.parseObject(str);

对4-9999的遍历(更节省内存)

    class NumberGenerator {
        private final int start;
        private final int end;
        private int current;
        public NumberGenerator(String range) {
            String[] parts = range.split("-");
            this.start = Integer.parseInt(parts[0]);
            this.end = Integer.parseInt(parts[1]);
            this.current = start;
        }
        public boolean hasNext() {
            return current <= end;
        }
        public int next() {
            return current++;
        }
    }
    
    //获取范围,生成NumberGenerator
    NumberGenerator generator = new NumberGenerator(item.getPosition());
    while (generator.hasNext()){
        int position = generator.next();
        allVideoStreams.put(position, item);
    }

获取字符串中task=xxxx中task的参数值

    private String getUrlParam(String paramName, String url){
        Pattern pattern = Pattern.compile("(?<=" + paramName + "=)[^&]+");
        Matcher matcher = pattern.matcher(url);
        String result = matcher.find() ? matcher.group() : "";
        return result;
    }