需求很简单,将从数据库中查到的某些数据写入到文件中。
于是就有了这个方法:
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());
}
}
?
?
|