1. 经过测试可以复制 txt excel csv exe pdf文件其他格式的没测,估计也没问题
public class Hello { private static final String LINE_SEPARATOR = System.getProperty("line.separator");//换行 public static void main(String[] args) throws Exception { FileInputStream reader = new FileInputStream("d:/毕向东Java基础课堂笔记.pdf"); FileOutputStream writer = new FileOutputStream("e:\\毕向东Java基础课堂笔记.pdf"); int len = 0; byte[] buffer = new byte[1024*1024];//1MB缓存 while((len = reader.read(buffer))!=-1){ //len = reader.read(buffer) buffer千万不要忘了,否则复制的文件超大 writer.write(buffer ,0 , len); writer.flush(); } System.out.println("复制成功"); writer.close(); reader.close(); }}
2.优化复制文件
public static void main(String[] args) throws Exception { File src = new File("d:/Evernote_6.1.2.2292.exe"); File des = new File("e:\\NEW_Evernote_6.1.2.2292.exe"); copyFile(src,des); } private static void copyFile(File src, File des) throws Exception{ FileInputStream reader = new FileInputStream(src); FileOutputStream writer = new FileOutputStream(des); int len = 0; byte[] buffer = new byte[1024*1024];//1MB缓存 while((len = reader.read(buffer))!=-1){ //len = reader.read(buffer) buffer千万不要忘了,否则复制的文件超大,陷入死循环 writer.write(buffer ,0 , len); writer.flush(); } System.out.println("复制成功"); writer.close(); reader.close(); }
3.下载文件三要素: contentType, contentLength, setHeader-"Content-Disposition"
File f = new File("d:/photo_04.jpg"); response.setHeader("Content-Disposition", "attachment; filename="+f.getName()); response.setContentType("image/jpeg"); FileInputStream fis = new FileInputStream(f); response.setContentLength(fis.available()); byte[] buf = new byte[1024]; int len = 0; while((len = fis.read(buf))!=-1){ response.getOutputStream().write(buf, 0, len); }
4.优化: 在doGet方法中调用即可!
private static MapimageContentType = new HashMap (); static{ imageContentType.put("jpg", "image/jpeg"); imageContentType.put("jpeg", "image/jpeg"); imageContentType.put("png", "image/png"); imageContentType.put("tif", "image/tiff"); imageContentType.put("tiff", "image/tiff"); imageContentType.put("ico", "image/x-icon"); imageContentType.put("bmp", "image/bmp"); imageContentType.put("gif", "image/gif"); } public static void writeImgToResponse(File image, HttpServletResponse response) throws Exception{ FileInputStream fis = new FileInputStream(image); response.setContentLength(fis.available()); String filename = image.getName(); response.setHeader("Content-Disposition", "attachment; filename=" + filename); String type_key = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); response.setContentType(imageContentType.get(type_key)); byte[] buf = new byte[1024*1024]; int len = 0; while((len = fis.read(buf)) != -1){ response.getOutputStream().write(buf, 0, len); } }
5.继续优化:当用到框架的时候,不懂为什么不设置下载头?
public static void writeImgToResponse(File image, HttpServletResponse response) throws Exception { FileInputStream inputStream = new FileInputStream(image); int length = inputStream.available(); byte data[] = new byte[length]; response.setContentLength(length); String fileName = image.getName(); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); response.setContentType(imageContentType.get(fileType)); inputStream.read(data); OutputStream toClient = response.getOutputStream(); toClient.write(data); toClient.flush(); IOUtils.closeQuietly(toClient); IOUtils.closeQuietly(inputStream); }