IO流复制文件

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 Map<String,String> imageContentType = new HashMap<String,String>();
	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);
    }

 

posted @ 2016-08-26 17:46  黑土白云  阅读(197)  评论(0编辑  收藏  举报