【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"};

  

 

posted @ 2018-10-31 20:30  calll_me_gaga  阅读(213)  评论(0编辑  收藏  举报