首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 導出 TXT 文件完整實現方案

     編輯:Java 相關知識

核心思路

通過 HttpServletResponse 設置響應頭,將數據流直接寫入瀏覽器下載,無需在服務器生成臨時文件。關鍵步驟:

  1. 設置 Content-Type: text/plain
  2. 設置 Content-Disposition: attachment; filename=xxx.txt 觸發下載
  3. 使用 BufferedOutputStream 包裝 ServletOutputStream 高效寫入
  4. 指定字符編碼(推薦 UTF-8)避免中文亂碼

方案一:Spring MVC 導出查詢結果

@RequestMapping(value = "/grab/export/csv", method = RequestMethod.GET)
public void exportCsv(HttpServletRequest request, HttpServletResponse response) {
    String userId = ServletRequestUtils.getStringParameter(request, "userId", "test");
    List<VideoListModel> list = sqlVideoList.selectSuccessDate(userId);

    response.setContentType("text/plain;charset=UTF-8");
    String fileName = "videolist.txt";
    try {
        fileName = URLEncoder.encode(fileName, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

    try (BufferedOutputStream buff = new BufferedOutputStream(response.getOutputStream())) {
        StringBuilder write = new StringBuilder();
        String enter = "\r\n";
        if (list != null && !list.isEmpty()) {
            for (VideoListModel model : list) {
                write.append(model.getUrl()).append(",")
                     .append(model.getTitle()).append(enter);
            }
        }
        buff.write(write.toString().getBytes("UTF-8"));
        buff.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方案二:導出 VIP 兌換碼(帶狀態標識)

@RequestMapping(value = "/{exchangeId}/{packageId}/export", method = RequestMethod.GET)
public void writeToTxt(@PathVariable String exchangeId, @PathVariable String packageId,
                       HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    String schoolId = getSchoolId(request);
    List<VipCode> vipCodes = vipExchangeManager.getVipCode(example);

    if (vipCodes.isEmpty()) return;

    response.setContentType("text/plain;charset=UTF-8");
    String fileName = URLEncoder.encode(vipCodes.get(0).getName(), "UTF-8") + ".txt";
    response.addHeader("Content-Disposition", "attachment; filename=" + fileName);

    try (BufferedOutputStream buff = new BufferedOutputStream(response.getOutputStream())) {
        StringBuilder write = new StringBuilder();
        String tab = "\t";
        String enter = "\r\n";

        for (int i = 0; i < vipCodes.size(); i++) {
            VipCode code = vipCodes.get(i);
            write.append(i + 1).append(tab)           // 序號
                 .append(code.getExchangeCode()).append(tab) // 兌換碼
                 .append("normal".equals(code.getStatus()) ? "正常" : "已兌換") // 狀態
                 .append(enter);
        }
        buff.write(write.toString().getBytes("UTF-8"));
        buff.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

關鍵最佳實踐

  • try-with-resources:JDK 7+ 自動關閉流,避免資源洩漏
  • StringBuilder:高效拼接字符串,避免頻繁創建對象
  • 編碼一致性:文件名、內容寫入均使用 UTF-8
  • 大數據分批:超大數據量時建議分頁查詢、分批寫入,防止 OOM
  • 異常處理:捕獲 IO 異常並記錄日誌,不拋出給前端

常見問題排查

現象可能原因解決方案
文件名亂碼文件名未 URLEncoder.encode下載前對文件名編碼
內容亂碼寫入編碼與聲明不一致統一使用 UTF-8
下載空文件流未 flush/close確保 buff.flush() 執行
大文件導出慢一次性載入所有數據流式查詢 + 分批寫入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved