You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java代码将MyDocuments中的SQLite数据库备份到桌面?

Polished SQLite Backup Solution for Java

Hey there, let's fix up your SQLite backup code to make it reliable, cross-platform, and complete. Your original snippet had a solid start, but there were a few gaps and edge cases to address—here's a refined implementation with explanations:

Complete Backup Code

import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class SQLiteBackup {
    public static void main(String[] args) {
        // Configure your database details here
        String dbFileName = "school.db"; // Name of your SQLite database file
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmmss"); // Safe for file names
        String backupFolderName = "school database backup";

        try {
            // Get the exact path to My Documents (works across Windows/macOS/Linux)
            File myDocuments = FileSystemView.getFileSystemView().getDefaultDirectory();
            File sourceDb = new File(myDocuments, dbFileName);

            // Validate source file exists
            if (!sourceDb.exists()) {
                System.err.println("Error: Couldn't find database file at " + sourceDb.getAbsolutePath());
                return;
            }

            // Get Desktop path
            String userHome = System.getProperty("user.home");
            File desktop = new File(userHome, "Desktop");
            File backupRoot = new File(desktop, backupFolderName);

            // Create backup directory (including parent folders if needed)
            if (!backupRoot.exists() && !backupRoot.mkdirs()) {
                System.err.println("Error: Failed to create backup folder at " + backupRoot.getAbsolutePath());
                return;
            }

            // Generate timestamped backup filename
            String timestamp = dateFormatter.format(LocalDateTime.now());
            String backupFileName = String.format("%s_%s.db", dbFileName.replace(".db", ""), timestamp);
            File backupDb = new File(backupRoot, backupFileName);

            // Copy the database file (overwrite if exists, preserve file attributes)
            Files.copy(
                    sourceDb.toPath(),
                    backupDb.toPath(),
                    StandardCopyOption.REPLACE_EXISTING,
                    StandardCopyOption.COPY_ATTRIBUTES
            );

            System.out.println("Backup succeeded! File saved to: " + backupDb.getAbsolutePath());

        } catch (IOException e) {
            System.err.println("Backup failed due to an IO error:");
            e.printStackTrace();
        }
    }
}

Key Improvements & Validation

  • Cross-Platform Path Handling: Uses FileSystemView to get the correct My Documents path (no more hardcoding paths that break on non-Windows systems) and relies on Java's File class to handle path separators automatically.
  • Safe Filename Formatting: Replaced / in the date format with - and _ to avoid invalid characters in file paths (Windows doesn't allow / in filenames).
  • Robust Error Checking: Checks if the source database file exists before attempting to copy, verifies that the backup directory was created successfully, and catches IO exceptions to debug failures.
  • Reliable File Copy: Uses Java NIO's Files.copy() which automatically handles resource cleanup (no need to manually close streams) and includes options to overwrite existing backups and preserve file attributes like creation time.

Critical Note for SQLite Backups

If your application is actively connected to the SQLite database, direct file copying can result in corrupted backups. For a safer approach, use SQLite's built-in BACKUP TO command via JDBC:

// Add this to your code instead of Files.copy() if you have an active JDBC connection
try (Statement stmt = yourSqliteConnection.createStatement()) {
    String backupPath = backupDb.getAbsolutePath().replace("\\", "\\\\"); // Escape backslashes for Windows
    stmt.execute(String.format("BACKUP TO '%s'", backupPath));
}

This command ensures the backup is consistent even if the database is being used.

内容的提问来源于stack exchange,提问作者Rodney Nart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:29:07