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

Java 讀取 SQL Server TEXT/BLOB 字段並導出文件實戰:JDBC 流式處理與 Base64 解碼完整方案

     編輯:Java 程式設計入門

業務場景

歷史系統將文檔(Word、PDF、圖片等)以 TEXT 或 IMAGE 類型存儲在 SQL Server 中,需遷移至文件系統。字段內容為 Base64 編碼字符串。

完整導出程序

import java.io.*;
import java.sql.*;
import org.dbunit.util.Base64; // 或 Apache Commons Codec

public class BlobExporter {
    public static void main(String[] args) throws Exception {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test1";
        try (Connection conn = DriverManager.getConnection(url, "sa", "123456");
             PreparedStatement ps = conn.prepareStatement("SELECT FileName, Content FROM aa");
             ResultSet rs = ps.executeQuery()) {

            while (rs.next()) {
                String fileName = rs.getString("FileName");
                String base64 = rs.getString("Content");
                byte[] data = Base64.decode(base64);
                writeFile(data, "D:/doc", fileName);
            }
        }
    }

    private static void writeFile(byte[] data, String dirPath, String fileName) {
        File dir = new File(dirPath);
        if (!dir.exists()) dir.mkdirs();
        File file = new File(dir, fileName);
        try (FileOutputStream fos = new FileOutputStream(file);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            bos.write(data);
            System.out.println("導出:" + file.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

關鍵技術點

  1. 流式讀取:ResultSet.getString 適合中小文本;大對象建議 getBinaryStream() 分塊讀取,避免 OOM;
  2. Base64 解碼:推薦 java.util.Base64 (Java 8+) 或 Apache Commons Codec,org.dbunit.util.Base64 較舊;
  3. 資源管理:try-with-resources 自動關閉連接、流,防洩漏;
  4. 目錄創建:mkdirs() 遞歸創建父目錄;
  5. 緩衝寫入:BufferedOutputStream 提升寫入吞吐。

大文件優化版(分塊流式)

try (InputStream is = rs.getBinaryStream("Content");
     FileOutputStream fos = new FileOutputStream(file);
     BufferedOutputStream bos = new BufferedOutputStream(fos)) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = is.read(buf)) != -1) {
        bos.write(buf, 0, len);
    }
}

避免將完整 Base64 字符串載入 JVM 堆,支援 GB 級大對象導出。

常見問題排查

  • Base64 解碼失敗:確認數據庫字段確為標準 Base64,無換行/空格污染;
  • 文件損壞:檢查原始存儲邏輯,是否為壓縮/加密後再 Base64;
  • 權限不足:SQL Server 賬號需 SELECT 權限,文件目錄需寫入權限;
  • 驅動版本:mssql-jdbc 12.x+ 支援 JDK 11+,舊版 sqljdbc4 僅支援 JDK 8。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved