java写文件、导出效率问题以及下载问题

本文深入探讨了Java中常见的输出流方法,包括OutputStream和Writer类的使用场景,如FileOutputStream用于图片流数据的写入,FileWriter用于文本数据的覆盖写入与追加写入。文章还对比了FileOutputStream、BufferedOutputStream和BufferedWriter的性能,并介绍了如何使用BufferedWriter实现在浏览器中下载.sql文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先比较常用的输出流方法分为两大类: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)); 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值