【lris.commons】文件保存器FileContentSaver
----------昨天把机器上的mysql从5.0.20.更新到了8.0.13,之后开发mybatis-generator插件就连不上了,无从下手,不过联系上了插件作者,作者很耐心的帮我解决了问题,好开心~----------
文件保存器跟之前的文件读取器FileContentGetter对应,基本是将对文本文件,区分行的文件,csv格式的表格文件,将其操作反过来。
文件读取器的读取代码,在java8中还有一个跟简洁的写法,便是调用Files.lines方法。
以读取区分行的读取方法为例
public static List<String> toStringList(String fileName, String charset, long max_value) { try (Stream<String> stream = Files.lines(Path.of(fileName), Charset.forName(charset))) { return stream.parallel().limit(max_value).collect(Collectors.toList()); } catch (IOException e) { e.printStackTrace(); } return toStringList(new File(fileName), charset, max_value); }
Files.lines方法能直接将一个文件转换成Stream对象,直接用Stream的方法操作即可,其中用到了try-with-resources写法,将读取的对象定义代码写到try后面的小括号中,防止内存泄露。
Files.lines方法需要两个参数,一个是编码集,一个是Path对象。
Path对象是1.7开始才有的一个类,而Path.of是JAVA11才有的方法,不过这里的Path.of也可以用Paths.get方法,使用起来是一样的。
Path.of方法中,你可以传如好多个String.
一开始我以为是可以同时传入好多个文件来着- -。
但实际是,这些String最终会被组装成一个路径,比如D:\\desktop\\datas\\abc.csv文件
可以通过Path.of("D:\\desktop","datas","abc.csv")这样的方式去获取。
Path path = Path.of("D:", "Desktop", "OneDrive", "工作日志", "20180511_毕业论文_比较沪金与XAU的走势", "source", "SQAUMI.csv"); System.out.println(path.toString()); D:\Desktop\OneDrive\工作日志\20180511_毕业论文_比较沪金与XAU的走势\source\SQAUMI.csv Process finished with exit code 0
相比File类,Path类可以不用去关心用正斜杠还是反斜杠。
Path和File可以互相转化。
FileContentSaver代码如下
public static void save(String address, String content) { try { Files.writeString(Path.of(address), content, Charset.forName("utf-8")); } catch (IOException e) { e.printStackTrace(); } } public static void save(String address, List<String> content) { try { Files.write(Path.of(address), content, Charset.forName("utf-8")); } catch (IOException e) { e.printStackTrace(); } } public static void save_csv_no_head(String address, List<Map<String, String>> content) { try { Files.write(Path.of(address), content.parallelStream().map(a1 -> { StringJoiner sj = new StringJoiner(","); int index = 0; while (a1.containsKey(HEADS_OF_AUTO_NAME[index])) { sj.add(a1.get(HEADS_OF_AUTO_NAME[index])); index++; } return sj.toString(); }).collect(Collectors.toList()), Charset.forName("utf-8")); } catch (IOException e) { e.printStackTrace(); } } public static void save_csv_has_head(String address, List<Map<String, String>> content) { try { Set<String> heads = content.get(0).keySet(); Files.write(Path.of(address), Stream.concat(heads.parallelStream().reduce((a1, a2) -> a1 + "," + a2).stream(), content.parallelStream().map(a1 -> { StringJoiner sj = new StringJoiner(","); heads.parallelStream().forEachOrdered(a2 -> { sj.add(a1.get(a2)); }); return sj.toString(); })).collect(Collectors.toList()), Charset.forName("utf-8")); } catch (IOException e) { e.printStackTrace(); } } private static final String[] HEADS_OF_AUTO_NAME = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU"};