copy自:https://blog.csdn.net/weixin_37703598/article/details/80387061
1.
out = response.getWriter(); response.reset(); response.addHeader("Content-Disposition", "attachment;filename=" + taskId + ".html"); response.addHeader("Content-Length", "" + htmlData.getBytes().length); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); out.print(htmlData); out.flush(); try { response.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
2.String dfileName = file.getName();
fis = new BufferedInputStream(new FileInputStream(file)); response.reset(); response.setContentType("application/x-download"); response.addHeader("Content-Disposition", "attachment;filename=" + new String(dfileName.getBytes(), "iso-8859-1")); response.addHeader("Content-Length", "" + file.length()); toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); byte[] buffer = new byte[1024 * 1024 * 4]; int i = -1; while ((i = fis.read(buffer)) != -1) { toClient.write(buffer, 0, i); } toClient.flush(); try { response.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
1. PrintWriter是以字符為單位,對所有的信息進行處理,而ServletOutputStream僅對二進制的資料進行處理。
2. PrintWriter在輸出字符文本時內部需要將字符串轉換成某種字符集編碼的字節數組,使用他的好處就是不需要自己來完成從字符串到字節數組的轉換。 轉換的字符集編碼是通過設置setContentTpye或setCharacterEncoding或setLocale等方法實現的;使用ServletOutputStream對象直接從一個字節輸入流中讀取出來,然后再原封不動的輸出到客服端。
3. 這兩個方法相互排斥,只能調用其一,如果要用,則要在換方法之前調用flush(),將緩沖區數據沖掉。
4. PrintWriter自動清空緩沖區的功能被使能時(構造函數中autoFlush置為true),僅當println()方法被調用時才自動清緩沖區,而不是像PrintStream一樣遇到一個換行符就清緩沖。
兩種方法的取舍:
使用PrintWriter會占用一些系統開銷,因為它是為處理字符流的輸出輸出功能。因此PrintWriter應該使用在確保有字符集轉換的環境中。換句話說,在你知道servlet返回的僅僅是二進制數據時候,應該使用ServletOutputStream,這樣你可以消除字符轉換開銷,當servlet容器不用處理字符集轉換的時候。
附:寫文件最佳組合
PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter(filename))) ;
PrintWriter 提供print系方法
BufferedWriter 提供緩沖,用以加速
FileWriter 用於寫文件
3. 這兩個方法相互排斥,只能調用其一,如果要用,則要在換方法之前調用flush(),將緩沖區數據沖掉。
4. PrintWriter自動清空緩沖區的功能被使能時(構造函數中autoFlush置為true),僅當println()方法被調用時才自動清緩沖區,而不是像PrintStream一樣遇到一個換行符就清緩沖。
兩種方法的取舍:
使用PrintWriter會占用一些系統開銷,因為它是為處理字符流的輸出輸出功能。因此PrintWriter應該使用在確保有字符集轉換的環境中。換句話說,在你知道servlet返回的僅僅是二進制數據時候,應該使用ServletOutputStream,這樣你可以消除字符轉換開銷,當servlet容器不用處理字符集轉換的時候。
附:寫文件最佳組合
PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter(filename))) ;
PrintWriter 提供print系方法
BufferedWriter 提供緩沖,用以加速
FileWriter 用於寫文件