要想将字节数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();
  • 通过字节输出流写数据: outputStream.write(字节数据);

接下来,我们实现通过些案例把响应字符数据给实际应用下:

1. 返回一个图片文件到浏览器

  1. /**
  2. * 响应字节数据:设置字节数据的响应体
  3. */
  4. @WebServlet("/resp4")
  5. public class ResponseDemo4 extends HttpServlet {
  6. @Override
  7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. //1. 读取文件
  9. FileInputStream fis = new FileInputStream("d://a.jpg");
  10. //2. 获取response字节输出流
  11. ServletOutputStream os = response.getOutputStream();
  12. //3. 完成流的copy
  13. byte[] buff = new byte[1024];
  14. int len = 0;
  15. while ((len = fis.read(buff))!= -1){
  16. os.write(buff,0,len);
  17. }
  18. fis.close();
  19. }
  20. @Override
  21. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22. this.doGet(request, response);
  23. }
  24. }

上述代码中,对于流的copy的代码还是比较复杂的,所以我们可以使用别人提供好的方法来简化代码的开发,具体的步骤是:
(1)pom.xml添加依赖

commons-io
commons-io
2.6

(2)调用工具类方法
//fis:输入流
//os:输出流
IOUtils.copy(fis,os);
优化后的代码:

  1. /**
  2. * 响应字节数据:设置字节数据的响应体
  3. */
  4. @WebServlet("/resp4")
  5. public class ResponseDemo4 extends HttpServlet {
  6. @Override
  7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. //1. 读取文件
  9. FileInputStream fis = new FileInputStream("d://a.jpg");
  10. //2. 获取response字节输出流
  11. ServletOutputStream os = response.getOutputStream();
  12. //3. 完成流的copy
  13. IOUtils.copy(fis,os);
  14. fis.close();
  15. }
  16. @Override
  17. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. this.doGet(request, response);
  19. }
  20. }