剛才自己做一個小例子,就是在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大小,轉換成字節B的話用來創建數組,值就顯得比較大了。應該是在此處造成的內存問題導致出現了這種莫名其妙的錯誤。
因為自己也是剛學習Java不久,所以很多也只是猜測,沒有去研究源碼或者看更加深入的書,所以如果大家有什么更好的解釋或者說更專業的解釋,還望指點一二。讓我也能解惑。謝謝啦。
