需求很简单,将从数据库中查到的某些数据写入到文件中。
于是就有了这个方法:
public void writeFile(List<String> glassList) { long start = System.currentTimeMillis(); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); BufferedWriter out = null; try { String filePath = FILE_PATH + "a.txt"; File file = new File(filePath); if (file.isFile() && file.exists()) { file.delete(); } out = new BufferedWriter(new FileWriter(filePath, true)); LocalDateTime localDateTime = LocalDateTime.now(); String localTime = df.format(localDateTime); for (int i = 0; i < glassList.size(); i++) { out.write(glassList.get(i)); out.newLine(); } logger.info("writeFile successful,totoal:{},cost:{}ms", glassList.size(),System.currentTimeMillis() - start); } catch (IOException | InterruptedException e) { logger.error(e.getMessage()); } finally { if (out != null) { try { out.close(); } catch (IOException e) { logger.error(e.getMessage()); } } } }
debug的时候发现这个方法写的文件竟然有截断和漏数据的问题。
这种write的方法是 开了一个 BufferedWriter 对象。一行一行的写入。
try catch后的finall 也会关闭这个out对象.
网上有两种说法: 1、没有close 2、需要flush
如果是写完flush没啥效果,最保险的是每写完一行就flush到磁盘。显然这种方法的代价有点大。
于是有了下面这个改进版本。
java8 直接将list传入,然后序列化为单个字符处理,使用该方法之后没有出现数据截断和漏数据的情况。
推荐使用java8的File.write
public void writeFile(List<String> glassList) { long start = System.currentTimeMillis(); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); BufferedWriter out = null; try { String filePath = FILE_PATH + "shippingTmp.txt"; File file = new File(filePath); if (file.isFile() && file.exists()) { file.delete(); } LocalDateTime localDateTime = LocalDateTime.now(); try { Files.write(Paths.get(filePath), glassList, StandardCharsets.UTF_8); } catch (IOException e) { logger.info("writeFile failed:{}",e); throw new RuntimeException(e); } logger.info("writeFile successful,totoal:{},cost:{}ms", glassList.size(), System.currentTimeMillis() - start); } catch (Exception e) { logger.error(e.getMessage()); } }