1、背景
前几天项目上线,就是把MVC框架由Spring MVC换成Restlet,然后客户说原有的TXT文件导出功能报500了,而且生产上没有报错日志,而后面更有客户说某些的TXT文件导出功能是可行的。经过场景复现,最终推导出这个TXT功能大文件导出是正常的,而小文件就会失败。
针对这种场景,当时就猜测是由于小文件在写入缓冲区后到响应给浏览器时出现了异常,最终经过层层的堆栈分析,发现Restlet框架是用的ServletOutputStream对象去写信息,而TXT导出的功能类用的是PrintWriter对象去写出,而在Response对象的定义中,只能用一种方式去进行写出响应信息。而为什么这样定义,这是因为ServletOutputStream用的是OutputBuffer对象的字节流bb数组,而PrintWriter用的是OutputBuffer对象的cb数组,所以这两种方式不能同时使用。
2、原因查找
2.1 小文件失败
我们先来看Response对象获取PrintWriter与ServletOutputStream的两个方法