Java web 中文件下载遇到的缓冲大小问题
2016-04-11 23:02
399 查看
刚才自己做一个小例子,就是在android端点击一个button,然后从服务器端下载文件到手机SD卡。结果却遇到了问题,刚开始挺兴奋的,因为自己做的可以下载下来文件了,但是自习看才发现有问题,那就是下载到文件的大小却是0,导出后无法打开,搞不懂,然后不知道怎么搞的过了一会儿,文件大小自己又变化了,下载的一个txt的文件大小恢复正常,而下载的mp3文件却只有198K,如下图:
我的服务端代码如下图:
遇到这么奇葩的问题,我就开始想读取txt那个就成功了,为什么这个却失败了,看了看代码才知道,原来自己读取的方式不一样,在读取txt的时候代码如下;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = this.getServletContext().getRealPath("/download/pig.jpg"); String filename = path.substring(path.lastIndexOf("\\") + 1); // 这里如果把path.lastIndexOf("\\")中内容改为"/",则下载下来的文件名含有完整路径。 // 相当于直接设置为response.setHeader("content-disposition", // "attachment;filename="+ path); InputStream in = null; OutputStream out = null; response.setHeader("content-disposition", "attachment;filename=" + filename); try { in = new FileInputStream(path); out = response.getOutputStream(); int len = 0; byte buffer[] = new byte[1024]; while ((len = in.read(buffer)) != 0) { out.write(buffer, 0, len); } } catch (Exception e) { // TODO: handle exception } finally { try { in.close(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
从上面大家可以看出二者的区别,那就是作为缓冲的byte数组的长度问题,一个是直接固定的1024大小,另一个是自己为了运用一种网上别人写代码的习惯尝试着直接判断流里数据的大小,由此来一次性的生成一个大小刚好的数组来存放数据,事实证明错误恰恰就出在此,按照读取txt文件的方式改变读取mp3文件的代码,发现程序运行正常了。
解释:
因为mp3文件不同于文本文件,MP3格式的歌曲完整的小的一般的也有2,3M大小,转换成字节B的话用来创建数组,值就显得比较大了。应该是在此处造成的内存问题导致出现了这种莫名其妙的错误。
因为自己也是刚学习Java不久,所以很多也只是猜测,没有去研究源码或者看更加深入的书,所以如果大家有什么更好的解释或者说更专业的解释,还望指点一二。让我也能解惑。谢谢啦。
相关文章推荐
- java ssm框架入门(一)面向接口编程
- Java入门 第一季第五章 编程练习解析
- springmvc hibernate事务管理read-only属性
- LeetCode Plus One 66
- java was started but returned exit code=-1
- Spring Bean
- 【华为机试题】将输入字符串中的大写字符改为小写,标点符号空格等删除
- 【华为机试题】将输入字符串中的大写字符改为小写,标点符号空格等删除
- java中构造函数中变量初始化时机
- SpringMVC与Struts 的区别
- Java中修饰符,包装类,抽象类
- springmvc事务回滚失效
- 把java中的list对象转换成net.sf.JSONArray类型对象
- 代理模式(java语言实现)
- 如何在eclipse中更改jsp页面的charset以解决中文乱码问题
- 主讲spring mvc 在web.xml中的配置
- Java中的字符串类
- Java中的取模运算
- 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)
- java 反射 调用