PrintWriter和ServletOutputStream的区别

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   用于写文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发Java Web应用程序时,通常会涉及到将ServletOutputStream转换为InputStream的需求。这通常是因为要将一个Servlet中生成的输出数据传递给另一个Servlet来处理,而这个Servlet所期望的输入数据类型是InputStream。下面给出一种简单的方法可以实现这个转换过程。 在Servlet中,可以通过以下步骤将ServletOutputStream转换为ByteArrayInputStream: 1. 实现一个继承自ServletOutputStream的子类,并重写该类的write()方法。 2. 在write()方法中,将接收到的数据添加到一个ByteArrayOutputStream中。 3. 在Servlet执行完毕后,可以通过ByteArrayInputStream获取到写入的数据,并将其传递给需要使用InputStream的Servlet。 下面是具体的实现步骤: 1. 创建一个自定义的ServletOutputStream子类,实现write()方法 public class MyServletOutputStream extends ServletOutputStream { private ByteArrayOutputStream baos = new ByteArrayOutputStream(); @Override public void write(byte[] b) throws IOException { baos.write(b); } @Override public void write(int b) throws IOException { baos.write(b); } } 2. 在Servlet中,将response.getOutputStream()替换为自定义的MyServletOutputStream实例 MyServletOutputStream sos = new MyServletOutputStream(); PrintWriter pw = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.setBufferSize(1024); response.getOutputStream(); 3. 实现Servlet的doPost()方法,在方法内部获取MyServletOutputStream中的数据 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { MyServletOutputStream sos = new MyServletOutputStream(); PrintWriter pw = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.setBufferSize(1024); response.getOutputStream(); // 执行输出操作,并将数据写入到 MyServletOutputStream 中 sos.write(“Hello World”.getBytes()); // 转换 MyServletOutputStream 为 ByteArrayInputStream ByteArrayInputStream bis = new ByteArrayInputStream(sos.baos.toByteArray()); } 通过以上的实现,我们可以将ServletOutputStream成功转换为InputStream,实现Servlet间数据的传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值