File f = new File("");
try {
String dir= f.getCanonicalPath();
System.out.println("当前文件路径:"+dir);
} catch (IOException e) {
log.error("获取文件路径失败:{}", e.getMessage());
throw new RuntimeException(e);
}
private static void writeAppend(String path, String sheetName, List<RuleData> list) {
File file = new File(path + File.separator + FILENAME.split("\\.")[0] + "_result.xlsx");
File tempFile = new File(path + File.separator + UUID.randomUUID().toString().replace("-", "") + ".xlsx");
if (file.exists()) {
// 第二次按照原有格式,不需要表头,追加写入
EasyExcel.write(file, RuleData.class).needHead(false).
withTemplate(file).file(tempFile).sheet(sheetName).doWrite(list);
} else {
// 第一次写入需要表头
EasyExcel.write(file, RuleData.class).sheet(sheetName).doWrite(list);
}
if (tempFile.exists()) {
file.delete();
tempFile.renameTo(file);
}
log.info("写入{}成功!", file.getAbsolutePath());
}
在java中,一般为了避免windows系统和linux系统之间路径分隔符的差异,我们会使用File.separator来代替windows下的“\”或者Linux下的“/”,来表示文件路径。
如果需要分割路径来获取文件(夹)名,可以使用String.split(String regex)方法,如果只用一个File.separator作为参数会抛异常。
String separator = File.separator;
String path = "E:\\Program Files (x86)\\IdeaProjects\\leetcode\\src\\test\\1.txt";
for(String str : Arrays.asList(path.split(separator))){
System.out.println(str);
}
异常如下:

这是因为在Windows下,File.separator是“\”,经过转义识别为“\”,而String.split方法的参数应该要传入的是一个正则表达式字符串,传入“\”就会抛这个异常。因为在java中一个“\”代表的是转义字符。
这个时候如果还是要进行分割需要再加上一个反斜杠,并且需要对这个反斜杠加一个转义字符“\”。即代码中“\”代表一个反斜杠“\”。

如果这样写的话双引号中的 \ 会报错,因为idea预编译会报错:Illegal/unsupported escape sequence,即非法/不支持的转义序列错误,但是不影响程序运行。

我们还可以换种方式写:传入两个File.separator拼接起来作为参数,这样就不会预编译报错。

运行结果是一样的:

然而在Linux系统下,路径分隔符是“/”,分割的时候不需要转义,也就不需要加反斜杠,刚才那种写法就没办法在Linux系统中运行起来了。为了能够兼容Windows和Linux环境,可以使用正则表达式“/|\\”来完成。
/|\\\\

结果:

使用Collectors.groupingBy()。
例如:
Map<String, List<RuleData>> ruleDateGroup = ruleDataList.stream().collect(Collectors.groupingBy(RuleData::getName));
public static String getStrChinese(String str) {
String regEx = "[^\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}