PrintWriter和ServletOutputStream的区别

本文探讨了PrintWriter与ServletOutputStream的区别,前者适用于字符流处理并自动完成字符集转换,而后者专门处理二进制数据,避免了字符转换开销。文章还提供了使用建议及文件写的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

getwritergetoutputstream 现在项目 使用的是import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * 捕获原始输出的包装类 */ public class BufferedResponseWrapper extends HttpServletResponseWrapper { private final ByteArrayOutputStream buffer; private final ServletOutputStream outputStream; private PrintWriter writer; public BufferedResponseWrapper(HttpServletResponse response) { super(response); buffer = new ByteArrayOutputStream(); outputStream = new ServletOutputStream() { @Override public void write(int b) throws IOException { buffer.write(b); } @Override public boolean isReady() { return true; } @Override public void setWriteListener(WriteListener listener) { // 不需要异步写入 } }; } @Override public ServletOutputStream getOutputStream() { return outputStream; // 字节流 } @Override public PrintWriter getWriter() throws IOException { if (writer == null) { writer = new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()), true); } return writer; // 字符流 } /** * 获取捕获到的字节内容 */ public byte[] getCapturedBytes() throws IOException { flushBuffer(); return buffer.toByteArray(); } /** * 获取捕获到的字符串内容(会根据响应编码转换) */ public String getCapturedAsString() throws IOException { flushBuffer(); return buffer.toString(getCharacterEncoding()); } }
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值