最近遇到一个问题,需要下载上G的文件,使用传统的IO下载需要好久,后来用NIO改进了一下,其中FileChannel是建立了源和目标的直接通道,速度会快很多,写了一个下载工具类如下:
public static void downloadFile(File file, HttpServletResponse response){
OutputStream os = null;
try {
// 取得输出流
os = response.getOutputStream();
String contentType = Files.probeContentType(Paths.get(file.getAbsolutePath()));
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes("utf-8"),"ISO8859-1"));
FileInputStream fileInputStream = new FileInputStream(file);
WritableByteChannel writableByteChannel = Channels.newChannel(os);
FileChannel fileChannel = fileInputStream.getChannel();
fileChannel.transferTo(0,fileChannel.size(),writableByteChannel);
fileChannel.close();
os.flush();
writableByteChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
//文件的关闭放在finally中
finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用方法,Controller调用该方法就可以了,file是要下载的文件