起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2802|回复: 2

[处理中5] com.justep.doc.AbstractDoc download 方法有缺陷

[复制链接]

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
发表于 2014-8-8 12:46:56 | 显示全部楼层 |阅读模式
版本: 小版本号:
数据库: 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
在 com.justep.doc.AbstractDoc 的 download  方法中。
        public void download(OutputStream outputStream, String versionID, String partType) throws Exception {
                InputStream inputStream = this.download(versionID, partType);
                int bytesRead;
                byte[] buf = new byte[4 * 1024]; //4K buffer
                while ((bytesRead = inputStream.read(buf)) != -1) {
                        outputStream.write(buf, 0, bytesRead);
                }
                outputStream.flush();
                outputStream.close();
        }



没有 关闭 InputStream , 反而关闭了 outputStream , 如果 应用方需要反复使用 OutputStream 就变得不可行了。  inputStream 是由API 内部构建, 应该由内部提供关闭。 OutputStream 由API 外部提供 应该由外部负责关闭, 责任不能倒置!。

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-8-8 13:00:13 | 显示全部楼层
继续 上面的AbstractDoc 类里面的缺陷代码:在里面有一个内部类:
        private class HttpInputStream extends InputStream{
                private InputStream input;
                private HttpMethod method;
                public HttpInputStream(InputStream input,HttpMethod method) {
                        this.input = input;
                        this.method = method;
                }
                @Override
                public int read() throws IOException {
                        return this.input.read();
                }
                @Override
                public void close() throws IOException {
                        try{
                                this.input.close();
                        }finally{
                                if(this.method!=null){
                                        this.method.releaseConnection();
                                }
                        }
                }
               
        }
在这个实现里面 因为没有重载 public int read(byte b[], int off, int len) throws IOException 会导致输出流 1个字节一个字节的读取。效率很差!!!!

比较好的修订应该改为继承 FilterInputStream:
        private class HttpInputStream extends FilterInputStream{
                private HttpMethod method;
                public HttpInputStream(InputStream input,HttpMethod method) {
                        super(input);
                        this.method = method;
                }
               
                @Override
                public void close() throws IOException {
                        try{
                                this.input.close();
                        }finally{
                                if(this.method!=null){
                                        this.method.releaseConnection();
                                }
                        }
                }
               
        }
       


       
       

回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35920
发表于 2014-8-8 15:00:35 | 显示全部楼层
你好楼主,您反馈的这个现象将在后续版本完善,感谢楼主的支持与配合。
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-2 23:36 , Processed in 0.071457 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表