首先比较常用的输出流方法分为两大类:OutputStream类和Writer类,分别有FileOutputStream、BufferedOutputStream、FileWriter和BufferedWriter。
tips
- FileOutputStream是用于写入原始字节流比如图片流数据。如果是要写入字符流,则应该考虑使用FileWriter。 所以写图片应该使用FileOutputStream而写文本则应该选择FileWriter。
- 使用FileWriter写文件,一、覆盖写入(会清空文件内容),二、追加写入;当使用FileWriter覆盖写入时,碰到设备突然断电,会容易导致文件变成空文件,文件内容彻底丢了。所以,对于不带电池的设备来讲,重要文件写操作不要使用FileWriter,请使用FileOutputStream;
他们的性能问题可以详细见FileOutputStream、BufferedOutputStream和BufferedWriter的性能对比
通过上面的文章我们可以发现,写入字符流时,BufferedWriter的效率比较快,一般来说FileOutputStream和BufferedOutputStream会结合使用,FileWriter和BufferedWrite会结合使用,因为一个Buffer类存在flush方法,这个方法是将在缓存区的内容写到文件中去。所以可以提高效率,用来辅助FileOutputStream和FileWriter。
FileOutputStream 和FileWriter ,无缓冲区,write一次,就往文件里面写一次数据,效率较低。
BufferedOutputStream和 BufferedWriter,write方法将数据写入缓存区中,缓存区默认大小为8192byte,可通过构造函数定义。为了防止多次操作IO(操作IO很费cpu时间),提供了一个缓冲区,当缓冲区满的时候,再写入文件,从而提高效率。因此,如果缓冲区没有写满,那么就必须强制他输出到文件,即调用flush()。
如何实现浏览器下载,这里我们使用BufferedWriter来导出一个.sql文件
public int doUploadData() throws SQLException, ActiveRecordException, IOException {
response.setContentType("application/msexcel;");
//attachment表示响应下载文件
response.setHeader("Content-Disposition", "attachment;filename="
+ "upload.sql");
//获取服务器响应response的输出流
BufferedWriter bw=new BufferedWriter(response.getWriter());
String updateStr="";
/*
将sql语句存到updateStr中
*/
bw.write(updateStr);
bw.newLine();
bw.flush();
String insertStr="";
/*
将sql语句存到insertStr中
*/
bw.write(insertStr);
bw.newLine();
bw.flush();
bw.close();
}
之后就可以在浏览器的下载区看到这样的效果啦。
其中,关于导入导出时是否需要存入服务器中,我的处理方式是——下载的时候直接存储在客户机的下载文件中,而导入上传的时候是在服务器中保留了一个备份(也就是说上传后,存储在服务器中)
public void import(MultipartFile file) throws Exception {
String filename = file.getOriginalFilename();
if (filename != null) {
// 服务器路径
String filePath = request.getSession().getServletContext().getRealPath("/") + "downloadfile/"+ file.getOriginalFilename();
// 转存文件到服务器中
//如果该文件存在,将会覆盖
file.transferTo(new File(filePath));
}
}