Java web 中文件下载遇到的缓冲大小问题

刚才自己做一个小例子,就是在android端点击一个button,然后从服务器端下载文件到手机SD卡。结果却遇到了问题,刚开始挺兴奋的,因为自己做的可以下载下来文件了,但是自习看才发现有问题,那就是下载到文件的大小却是0,导出后无法打开,搞不懂,然后不知道怎么搞的过了一会儿,文件大小自己又变化了,下载的一个txt的文件大小恢复正常,而下载的mp3文件却只有198K,如下图:

我的服务端代码如下图:

遇到这么奇葩的问题,我就开始想读取txt那个就成功了,为什么这个却失败了,看了看代码才知道,原来自己读取的方式不一样,在读取txt的时候代码如下;

 1     protected void doGet(HttpServletRequest request,
 2             HttpServletResponse response) throws ServletException, IOException {
 3
 4         String path = this.getServletContext().getRealPath("/download/pig.jpg");
 5         String filename = path.substring(path.lastIndexOf("\\") + 1);
 6
 7         // 这里如果把path.lastIndexOf("\\")中内容改为"/",则下载下来的文件名含有完整路径。
 8         // 相当于直接设置为response.setHeader("content-disposition",
 9         // "attachment;filename="+ path);
10
11         InputStream in = null;
12         OutputStream out = null;
13
14         response.setHeader("content-disposition", "attachment;filename="
15                 + filename);
16
17         try {
18             in = new FileInputStream(path);
19
20             out = response.getOutputStream();
21
22             int len = 0;
23             byte buffer[] = new byte[1024];
24             while ((len = in.read(buffer)) != 0) {
25
26                 out.write(buffer, 0, len);
27             }
28
29         } catch (Exception e) {
30             // TODO: handle exception
31         } finally {
32             try {
33                 in.close();
34                 out.close();
35             } catch (Exception e) {
36                 // TODO Auto-generated catch block
37                 e.printStackTrace();
38             }
39         }
40
41     }

从上面大家可以看出二者的区别,那就是作为缓冲的byte数组的长度问题,一个是直接固定的1024大小,另一个是自己为了运用一种网上别人写代码的习惯尝试着直接判断流里数据的大小,由此来一次性的生成一个大小刚好的数组来存放数据,事实证明错误恰恰就出在此,按照读取txt文件的方式改变读取mp3文件的代码,发现程序运行正常了。

解释:

因为mp3文件不同于文本文件,MP3格式的歌曲完整的小的一般的也有2,3M大小,转换成自KB的话用来生成数组大 小,就显得比较大了。应该是在此处造成的内存问题导致出现了这种莫名其妙的错误。

因为自己也是刚学习Java不久,所以很多也只是猜测,没有去研究源码或者看更加深入的书,所以如果大家有什么更好的解释或者说更专业的解释,还望指点一二。让我也能解惑。谢谢啦。

时间: 2024-12-22 09:03:00

Java web 中文件下载遇到的缓冲大小问题的相关文章

CKEditor4 在java web中的应用说明(详细可行)

按照官方的说明书就可,这里主要注意一点!! 就是<script src="../ckeditor.js"></script>中js文件的路径问题,我的ckeditor文件夹是在WebContent文件夹下,jsp文件是同一层目录的,所以最后的代码应该是 <script type="text/javascript"src="./ckeditor/ckeditor.js"></script> 注意斜杆号

java web中servlet、jsp、html 互相访问的路径问题。

在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendRedirect(path); 情况二.指向内部的web组件和本身有关系的,这一类我暂时看到的有:servlet或者jsp的转发 假设在myapp项目下有

java web 中的转发和重定向

假设应用程序的 contextPath 为 /ctx,在 http://localhost:8080/ctx/a/b 资源中,我们转发和重定向到 http://localhost:8080/ctx/x/y 资源,分别应该怎么写? 转发,是在同一个应用程序中,请求从由资源 A 处理,到由资源 B 处理.资源 A 和资源 B 属于同一个应用程序的资源,它们总是相对于该应用程序的 contextPath 而言的.转发的资源可以使用相对路径(不以 "/" 开头)和绝对路径(以 "/&

jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)

一 简介和实现效果 这里用一个小例子来简单举例说明,做一个搜索引擎搜索提示效果,通过不断输入字符,然后在下方给出搜索提示.效果图如下: 通过上图可以看到,当输入一个"a"时,提示了很多内容,然后继续输入一个"e"后,提示的范围明显就变小了. 注:在文末我会给出完整源代码的下载链接,以供大家参考 二 具体实现 1 在eclipse for java ee中创建一个Java Web工程,然后导入相应的jar包,特别说明的是:这里要导入一个额外的dwr.jar.也就是说,

Java web中常见编码乱码问题(二)

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s

java web中路径问题。

转自:http://blog.csdn.net/liang5630/article/details/38474543 如有侵权,请及时联系本人及时删除 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendR

Java Web中涉及的编解码

用户从浏览器发起一个HTTP请求,存在编码的地方是URL.Cookie.Paramiter.服务器端接收到HTTP请求后要解析HTTP协议,其中URL.Cookie和POST表单参数要解码,服务器端可能还需要读取硬盘数据(数据库.文件),这些数据都可能存在编码问题.当Servlet处理完所有请求的数据后,需要将这些数据再编码通过Socket发送到用户请求的浏览器里,再经过浏览器解码成为文本.这些过程用图表示如下: 1.URL的编解码 为了验证浏览器是怎么编码URL的,我们选择FireFox浏览器

java web中请求和响应中包含中文出现乱码解析

说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码.想要避免出现乱码,需要使保存和读取时使用相同的码表. 在java web编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码 1 网页编码 在编写网页的时候,需要指定网页的编码格式,使用<meta http-equiv=&quo

【JAVA 核心技术】java web 中的监听器

为什么要有监听器? 监听器是用来处理一系列事件的java类,可被配置在java web项目中. 既然如此,为什么不用代码直接调用监听器? 这可能是因为J2EE规范规定的项目工程标准,用web.xml指定监听器, 然后服务器中间件如weblogic可以以遵照标准,读取web.xml, 运行监听器处理指定的事件. 这样,listener,servlet是类似的规范. 为什么要有web.xml? web.xml可以方便(也许不)地修改工程中用到的监听器. 这种东西像不像触发器或者轮询进程?如果像,它跟