zoukankan      html  css  js  c++  java
  • PrintWriter与ServletOutputStream的区别之文件下载

    copy自:https://blog.csdn.net/weixin_37703598/article/details/80387061
    1.
    out = response.getWriter(); response.reset(); response.addHeader("Content-Disposition", "attachment;filename=" + taskId + ".html"); response.addHeader("Content-Length", "" + htmlData.getBytes().length); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); out.print(htmlData); out.flush(); try { response.wait(); } catch (InterruptedException e) { e.printStackTrace(); }

    2.String dfileName = file.getName();
    fis = new BufferedInputStream(new FileInputStream(file));
    response.reset();
    response.setContentType("application/x-download");
    response.addHeader("Content-Disposition", "attachment;filename=" + new String(dfileName.getBytes(), "iso-8859-1"));
    response.addHeader("Content-Length", "" + file.length());
    toClient = new BufferedOutputStream(response.getOutputStream());
    response.setContentType("application/octet-stream");
    byte[] buffer = new byte[1024 * 1024 * 4];
    int i = -1;
    while ((i = fis.read(buffer)) != -1) {
        toClient.write(buffer, 0, i);
    }
    toClient.flush();
    try {
        response.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    1. PrintWriter是以字符为单位,对所有的信息进行处理,而ServletOutputStream仅对二进制的资料进行处理。 
    2. PrintWriter在输出字符文本时内部需要将字符串转换成某种字符集编码的字节数组,使用他的好处就是不需要自己来完成从字符串到字节数组的转换。 转换的字符集编码是通过设置setContentTpye或setCharacterEncoding或setLocale等方法实现的;使用ServletOutputStream对象直接从一个字节输入流中读取出来,然后再原封不动的输出到客服端。 
    3. 这两个方法相互排斥,只能调用其一,如果要用,则要在换方法之前调用flush(),将缓冲区数据冲掉。 
    4. PrintWriter自动清空缓冲区的功能被使能时(构造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲。 

    两种方法的取舍: 
    使用PrintWriter会占用一些系统开销,因为它是为处理字符流的输出输出功能。因此PrintWriter应该使用在确保有字符集转换的环境中。换句话说,在你知道servlet返回的仅仅是二进制数据时候,应该使用ServletOutputStream,这样你可以消除字符转换开销,当servlet容器不用处理字符集转换的时候。 

    附:写文件最佳组合 
    PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter(filename))) ;
    PrintWriter 提供print系方法 
    BufferedWriter 提供缓冲,用以加速 
    FileWriter 用于写文件
     
  • 相关阅读:
    《控制系统设计指南》第三章控制系统的调试读书笔记(二)
    机电传动控制第三周学习笔记
    PLECS软件学习使用(三)第三周仿真与计算作业
    PLECS软件学习使用(二)直流电机基本系统模型
    《控制系统设计指南》第一章和第二章读书笔记(一)
    《自动化技术中的进给电气传动》第一章的1.3节读书笔记(二)
    机电传动控制第二周学习笔记
    《实时控制软件设计》第一周作业 欧梓峰 U201317662 (更新)
    K3 查询收集
    K3 12.3应付收集
  • 原文地址:https://www.cnblogs.com/luojiabao/p/11065917.html
Copyright © 2011-2022 走看看