zoukankan      html  css  js  c++  java
  • response 输出中文数据 文件下载

    使用OutputStream或者PrintWriter向客户端浏览器输出中文数据

    package com.xc.response;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 使用OutputStream流向客户端浏览器输出中文数据
     */
    @WebServlet("/ResponseDemo01")
    public class ResponseDemo01 extends HttpServlet {
    
        private static final long serialVersionUID = 4312868947607181532L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 当需要向浏览器输出字符数据时,使用PrintWriter比较方便,省去了将字符转换成字节数组那一步。
            // outputChineseByOutputStream(response);// 使用OutputStream流输出中文
            outputChineseByPrintWriter(response);// 使用PrintWriter流输出中文
        }
    
        /**
         * 使用OutputStream流输出中文
         */
        public void outputChineseByOutputStream(HttpServletResponse response) throws IOException {
            /**
             * 使用OutputStream输出中文注意问题: 在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,
             * 比如:outputStream.write("中国".getBytes("UTF-8"));//使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出
             * 此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢? 可以通过设置响应头控制浏览器的行为,例如:
             * response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据
             */
            String data = "中国";
            OutputStream outputStream = response.getOutputStream();// 获取OutputStream输出流
            response.setHeader("content-type", "text/html;charset=UTF-8");// 通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            /**
             * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表, 如果是中文的操作系统环境,默认就是查找查GB2312的码表,
             * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字 比如: "中"在GB2312的码表上对应的数字是98 "国"在GB2312的码表上对应的数字是99
             */
            /**
             * getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表
             */
            byte[] dataByteArr = data.getBytes("UTF-8");// 将字符转换成字节数组,指定以UTF-8编码进行转换
            outputStream.write(dataByteArr);// 使用OutputStream流向客户端输出字节数组
        }
    
        /**
         * 使用PrintWriter流输出中文
         */
        public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException {
            String data = "中国";
            // 通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");// 设置将字符以"UTF-8"编码输出到客户端浏览器
            /**
             * PrintWriter out = response.getWriter();这句代码必须放在response.setCharacterEncoding("UTF-8");之后
             * 否则response.setCharacterEncoding("UTF-8")这行代码的设置将无效,浏览器显示的时候还是乱码
             */
            PrintWriter out = response.getWriter();// 获取PrintWriter输出流
            out.write(data);// 使用PrintWriter流向客户端输出字符
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    Response实现文件下载

    package com.xc.response;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 文件下载
     */
    @WebServlet("/ResponseDemo02")
    public class ResponseDemo02 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,
            // 而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
            downloadFileByOutputStream(response);// 下载文件,通过OutputStream流
        }
    
        /**
         * 下载文件,通过OutputStream流
         * 
         * @param response
         * @throws FileNotFoundException
         * @throws IOException
         */
        private void downloadFileByOutputStream(HttpServletResponse response) throws FileNotFoundException, IOException {
            // 1.获取要下载的文件的绝对路径
            String realPath = this.getServletContext().getRealPath("/static/download/莱绅-价值观.png");
            // 2.获取要下载的文件名
            String fileName = realPath.substring(realPath.lastIndexOf("\") + 1);
            // 3.设置content-disposition响应头控制浏览器以下载的形式打开文件
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            // 4.获取要下载的文件输入流
            InputStream in = new FileInputStream(realPath);
            int len = 0;
            // 5.创建数据缓冲区
            byte[] buffer = new byte[1024];
            // 6.通过response对象获取OutputStream流
            OutputStream out = response.getOutputStream();
            // 7.将FileInputStream流写入到buffer缓冲区
            while ((len = in.read(buffer)) > 0) {
                // 8.使用OutputStream将缓冲区的数据输出到客户端浏览器
                out.write(buffer, 0, len);
            }
            in.close();
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    参考文章:

    https://www.cnblogs.com/xdp-gacl/p/3789624.html

  • 相关阅读:
    OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
    OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
    努比亚(nubia) M2青春版 NX573J 解锁BootLoader 并进入临时recovery ROOT
    华为 荣耀 等手机解锁BootLoader
    青橙 M4 解锁BootLoader 并刷入recovery ROOT
    程序员修炼之道阅读笔03
    冲刺8
    典型用户模板分析
    学习进度八
    冲刺7
  • 原文地址:https://www.cnblogs.com/ooo0/p/10339233.html
Copyright © 2011-2022 走看看