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;
}
标签:String,processBuilder,jsonObject,Question,fileName,table,new,Recent
From: https://www.cnblogs.com/evenIer/p/17253127.html