文章目录
- [摘 要](#摘 要)
- 1.前言
-
- [1.1 研究背景](#1.1 研究背景)
- 1.2系统开发目的及意义
- 1.3国内外的研究现状
- 2.需求分析
- 3.概要设计
- 4.详细设计
- 5.系统实现
- 6.系统测试
- 7.总结
- 参考文献
- 全部代码&数据库链接
摘 要
一个基于Java GUI、MySQL和TimerTask实现的文件备份系统,提供了文件备份、文件夹备份、定时备份以及将备份数据存储到MySQL数据库的功能。通过用户友好的GUI界面,用户可以轻松选择要备份的文件或文件夹。系统使用Java的文件操作类实现了文件和文件夹的备份功能,同时利用TimerTask类实现了定时备份的功能。备份过程中,系统将备份的文件信息、备份时间等数据存储到MySQL数据库中,以便用户随时查看备份历史记录和摘要信息。
通过本报告所介绍的文件备份系统,用户可以在图形化界面下轻松进行文件备份操作,同时也能够根据自己的需求设置定时备份任务。备份的数据可以方便地存储到MySQL数据库中,用户可以随时查询和恢复需要的备份数据。这一系统不仅提高了文件备份的效率,也增强了数据的安全性和可靠性。未来,可以进一步扩展系统功能,如增加备份策略的定制、备份数据的压缩和加密等功能,以满足更多用户的需求。综上所述,该文件备份系统为用户提供了一种简单高效的文件备份解决方案,具有较好的可扩展性和实用性。
1.前言
1.1 研究背景
随着信息技术的不断发展,数据在我们的日常生活和工作中扮演着越来越重要的角色。然而,数据的安全性和可靠性也备受关注。在计算机系统中,文件备份是一项至关重要的任务,它可以确保数据不会因意外删除、系统故障或其他意外事件而丢失。因此,设计并实现一个高效可靠的文件备份系统对于用户来说具有重要意义。
在传统的文件备份系统中,一般通过命令行或专门的备份软件来进行操作,操作相对繁琐,对于普通用户来说可能存在一定的难度。为了提高用户体验和操作便利性,基于图形化界面(GUI)的文件备份系统应运而生。通过GUI界面,用户可以直观地选择要备份的文件或文件夹,并进行备份操作,使整个过程更加友好和便捷。
同时,随着数据量的增加和数据安全性的要求不断提高,定时备份功能也成为文件备份系统中的重要组成部分。定时备份可以帮助用户定期备份数据,避免因疏忽而导致数据丢失的风险。结合数据库存储备份信息,则可以让用户方便地查看备份历史记录和摘要信息,提升备份系统的可管理性和可追溯性。
基于以上背景,本课设旨在设计并实现一个基于Java GUI、MySQL和TimerTask的文件备份系统,提供了文件备份、文件夹备份、定时备份和将备份数据存储到MySQL数据库的功能。通过该系统,用户可以轻松实现文件备份操作,保障数据安全,提高数据管理效率,从而满足用户对数据备份的需求。
1.2系统开发目的及意义
1.2.1系统开发目的
该文件备份系统的开发旨在提供用户一个可靠、高效的数据备份解决方案,以确保重要数据的安全性。通过利用Java GUI、MySQL和TimerTask技术,系统实现了文件备份、文件夹备份、定时备份和数据库存储功能,使用户能够轻松进行数据备份操作。定时备份和数据库存储功能帮助用户及时备份数据并查看备份历史记录,从而降低数据丢失风险,提高数据安全性。
1.2.2意义
该文件备份系统的开发具有重要意义,首先是提高用户体验和操作便利性。通过图形化界面,用户可以直观选择备份内容、设置参数,简化备份操作流程,提升用户体验。其次,定时备份功能自动执行备份任务,节省时间、减少用户手动操作,提高工作效率。此外,数据库存储备份信息方便用户管理备份数据,随时查看备份记录,有利于数据追溯和管理。综上所述,该系统不仅有助于提高数据安全性,还促进了用户数据管理的便捷性和工作效率,具有实用性和学习意义。
1.3国内外的研究现状
1.3.1国内
在国内,一些知名互联网公司如阿里巴巴、腾讯等积极开展文件备份系统的研究与实践。他们通过自主研发和优化现有技术,致力于构建高效、可靠的文件备份解决方案。举例来说,阿里云推出了云备份服务,为用户提供自动备份、增量备份等功能,同时整合了数据加密技术,保障数据安全性。腾讯云也推出了文件存储和备份服务,支持定时备份、快照备份等功能,满足不同用户的备份需求。此外,清华大学、浙江大学等高校也在文件备份系统领域进行研究,探索备份策略优化、容灾备份等方面的创新。
图1 阿里云云备份使用场景
1.3.2国外
在国外,像Google、Amazon等科技巨头一直致力于文件备份系统的研究与发展。Google的G Suite提供了全面的文件备份和恢复功能,支持自动化备份、版本管理等特性,保障用户数据的安全性和可靠性。Amazon Web Services (AWS)也提供了弹性文件存储和备份服务,包括快速备份、跨区域备份等功能,满足不同规模企业的备份需求。此外,像Veeam、Acronis等专业备份软件公司也在数据备份领域不断创新,推出了具有高度可靠性和智能化特点的备份解决方案,受到广泛关注和应用。
综上所述,国内外文件备份系统的研究和实践都在不断推进,各机构和企业通过不同的技术手段和策略,努力提供更为高效、安全的文件备份服务,以应对日益增长的数据备份挑战。这些实践和研究成果促进了文件备份技术的不断创新和完善,为用户提供了更可靠的数据保护方案。
2.需求分析
2.1系统需求描述
该文件备份系统应具有高度的可靠性和稳定性,确保在数据备份过程中不会出现文件丢失或数据损坏等情况。为实现这一目标,系统需要满足以下功能要求:
(1)文件备份功能:用户可以通过简单操作选择需要备份的单个文件,确保文件备份过程可靠且完整。
(2)文件夹备份功能:用户可以选择整个文件夹进行备份,系统需要保证文件夹内所有文件的备份完整性和准确性。
(3)定时备份功能:用户可以设置备份时间,系统将在指定时间自动进行备份,提供了便捷的自动化备份方案,减少人工操作的需求。
(4)数据库存储功能:系统将备份的文件信息、备份时间等数据存储到MySQL数据库中,以便用户随时查看备份历史记录和摘要信息,确保备份数据的安全和易于管理。
(5)界面友好:系统应该具有简洁、清晰、易于使用的图形用户界面,让用户能够方便地进行文件和文件夹的选择、设置备份时间以及查询数据库信息,提供良好的用户体验和操作便利性。
(6)效率优化:系统需要保证备份速度尽可能快,同时应确保备份数据存储到数据库的效率,以提高系统的整体性能和用户满意度。
综上所述,该文件备份系统旨在提供可靠且高效的文件备份解决方案,并通过用户友好的界面和自动化功能,满足用户对文件备份操作的简便性和安全性需求。
2.2可行性分析
该文件备份系统可以从经济、技术、法律、以及社会可行性共四个角度去分析、去探讨。
(1)经济可行性:使用Java作为开发语言和GUI框架,以及MySQL作为数据库系统,这些都是开源且免费的技术,降低了系统开发和运行成本。
(2)技术可行性:①Java提供了丰富的GUI库,使得开发者可以轻松创建用户友好的界面。利用Java GUI技术,系统可以提供直观、易用的界面,让用户能够方便地选择要备份的文件或文件夹,操作起来更加直观和便捷。②MySQL作为一种成熟稳定的关系型数据库管理系统,具有良好的性能和可靠性。将备份数据存储到MySQL数据库中,能够有效管理备份信息,实现数据的持久化存储,并支持灵活的数据查询和管理,确保备份数据的安全可靠。③TimerTask类:TimerTask类是Java中用于实现定时任务的工具类,结合Timer类可以实现简单的定时任务调度。通过TimerTask类,系统可以实现定时备份功能,定期自动备份用户所选文件或文件夹,提高系统的自动化程度,减少用户手动操作,提升系统的实用性和效率。
(3)法律可行性:由于该系统需要备份用户的文件和文件夹信息,因此需要遵守相关的数据隐私保护法规,确保备份过程中用户数据的安全和保密。系统应该采取必要的措施,对用户的备份数据进行加密或其他安全处理,以确保备份过程不会泄露或损害用户的个人隐私权益。
(4)社会可行性:文件备份是大多数计算机用户都需要面对的问题,因此提供一个稳定、易用且高效的文件备份系统能够满足社会的实际需求。确保系统功能符合用户的期望,并通过用户反馈不断改进系统,提高用户满意度。
3.概要设计
3.1总体结构
经过分析,该文件备份系统可以分为四个模块:文件备份模块、文件夹备份模块、定时备份模块、备份信息存储模块,如下图所示。
图2 文件备份系统总体结构
3.2功能模块设计
3.2.1文件备份模块
(1)描述:该模块负责对单个文件进行备份操作,使用Java的File文件操作类实现,并保存备份信息到数据库中。
(2)功能:①在GUI中接收用户选择的文件路径和备份文件夹路径。
②检查备份文件夹中是否存在同名文件,若存在,则在文件名后加上后缀"-数字",表示第几个版本。
③将选定文件复制到备份文件夹路径中。
④备份完成后生成备份成功的提示信息。
⑤调用备份信息存储模块的保存数据库功能,将备份信息(文件路径、备份文件夹路径、备份成功的文件名称、备份时间等)存储到数据库中。
3.2.2文件夹备份模块
(1)描述:该模块负责对用户选择的文件夹进行递归备份操作,并保存备份信息到数据库中。
(2)功能:①在GUI中接收用户选择的文件夹路径和备份文件夹路径。
②递归遍历选定文件夹内所有文件和子文件夹。
③对于每个文件,检查备份文件夹中是否存在同名文件,若存在,则在文件名后加上后缀"-数字",表示第几个版本。
④将每个文件复制到备份文件夹路径中,保持原始文件夹结构。
⑤备份完成后生成备份成功的提示信息。
⑥调用备份信息存储模块的保存数据库功能,将备份信息(文件夹路径、备份文件夹路径、备份成功的文件名称、备份时间等)存储到数据库中。
3.2.3定时备份模块
(1)描述:该模块负责实现定时备份功能,使用TimerTask类实现。
(2)功能:①允许用户在GUI中设置备份的时间间隔和执行时间,以及选择需要备份的文件或文件夹。
②根据用户设置的时间间隔和执行时间,创建定时任务,触发备份操作。
③在设定的时间间隔内自动触发备份操作,调用文件备份模块和文件夹备份模块进行备份。
④每次备份完成后生成备份成功的提示信息,并将备份信息(备份路径、备份成功的文件名称、备份时间等)存储到数据库中。
⑤提供用户界面显示当前定时备份设置信息,包括备份时间间隔、执行时间等,方便用户管理和调整备份计划。
3.2.4备份信息存储模块
(1)描述:该模块负责将备份信息存储到MySQL数据库中,包括文件路径、文件夹路径、备份路径、备份成功的文件名称、备份时间等信息。
(2)功能:①建立与MySQL数据库的连接。
②创建备份信息表,包括字段:文件路径、文件夹路径、备份路径、备份成功的文件名称、备份时间等。
③在每次备份完成后,将备份信息插入到备份信息表中。
3.3界面设计
图3 界面设计图
图4 界面实际预览图
4.详细设计
4.1架构说明
该系统架构采用分层设计思想,总体分成三层:表现层、服务层、以及数据层;其中表现层使用Java GUI实现,用户可以手动选择要备份的文件、文件夹,或者选择要定时备份的文件夹;服务层使用Java语言实现,分为五个类:FileBackupSystem类为主程序入口、BackupScheduler类实现了定时备份功能、BackupFile类实现了备份文件功能、BackupFolder类实现了备份文件夹功能、BackupInfoToDB类实现了备份信息存储功能;数据层使用MySQL存储,存储了原文件存放的文件夹、原文件名、备份文件夹、备份文件名、以及备份时间。
图5 文件备份系统架构图
4.2类结构设计
在前面的系统架构说明中,以及阐述过了服务层使用Java语言实现,分为五个类:FileBackupSystem类为主程序入口、BackupScheduler类实现了定时备份功能、BackupFile类实现了备份文件功能、BackupFolder类实现了备份文件夹功能、BackupInfoToDB类实现了备份信息存储功能**,**以下图为系统的类UML图,包含属性、构造器、方法以及各个类之间的调用关系。
图6 文件备份系统UML图
4.3关键功能的时序图
4.3.1备份文件/文件夹功能
图7备份文件/文件功能时序图
4.3.2定时备份功能
图8定时备份功能时序图
4.4数据库设计
图9 back_info表字段设计图
5.系统实现
5.1数据库表创建
执行以下SQL语句,用于创建backup_info数据表
sql
CREATE TABLE backup_info (
id INT AUTO_INCREMENT PRIMARY KEY,
file_folder VARCHAR(255),
file_name VARCHAR(255),
backup_folder VARCHAR(255),
backup_file_name VARCHAR(255),
backup_time DATETIME
);
5.2搭建Java环境
图10 搭建Java环境图
5.3创建GUI系统页面
5.3.1核心代码
java
private JButton backupFileButton;
private JButton backupFolderButton;
private JButton choosePathButton;
private JButton startBackupButton;
private JLabel selectedFileLabel;
private JLabel selectedFolderLabel;
private JLabel selectedPathLabel;
private String sourceFilePath="1"; //源文件路径
private String sourceFolderPath="1"; //源文件夹路径
private String targetDirectoryPath; //备份目标文件夹路径
private boolean isBackupFileSelected = true;//默认选择备份文件
private JButton schedulerFileFolderButton;
private JButton schedulerBackupFolderButton;
private JButton schedulerStartBackupButton;
private JLabel schedulerFileFolderLabel;
private JLabel schedulerBackupFolderLabel;
private String schedulerFileFolderPath="1";
private String schedulerBackupFolderPath="1";
selectedFileLabel = new JLabel("已选择文件: ");
selectedFolderLabel =new JLabel("已选择文件夹:");
selectedPathLabel = new JLabel("备份路径: ");
schedulerFileFolderLabel=new JLabel("已选择文件夹(定时备份):");
schedulerBackupFolderLabel=new JLabel("已选择目标文件夹(定时备份):");
add(backupFileButton);
add(backupFolderButton);
add(choosePathButton);
add(selectedFileLabel);
add(selectedFolderLabel);
add(selectedPathLabel);
add(startBackupButton);
add(schedulerFileFolderButton);
add(schedulerBackupFolderButton);
add(schedulerFileFolderLabel);
add(schedulerBackupFolderLabel);
add(schedulerStartBackupButton);
setVisible(true);
5.3.2效果图
图11 页面效果图
5.4实现备份文件模块
java
/**
* @Description:备份文件
* @Param:
* @Return
*/
public static boolean backupFile(String sourceFilePath, String targetDirectoryPath) {
try {
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetDirectoryPath + File.separator + sourceFile.getName());
int count = 2;
String fileName = sourceFile.getName();
String fileNameWithoutExtension = fileName.replaceFirst("[.][^.]+$", "");
String fileExtension = fileName.substring(fileName.lastIndexOf("."));
while (targetFile.exists()) {
String newFileName = fileNameWithoutExtension + "-" + count + fileExtension;
targetFile = new File(targetDirectoryPath + File.separator + newFileName);
count++;
}
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
fis.close();
fos.close();
BackupInfoToDB.saveBackupFileInfoToDB(sourceFilePath, targetDirectoryPath, new File(String.valueOf(targetFile)).getName());
return true;
} catch (IOException e) {
// JOptionPane.showMessageDialog(this, "备份文件时出错: " + e.getMessage());
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return false;
}
5.5实现备份文件夹模块
java
public static boolean backupFolder(String sourceFolderPath, String targetDirectoryPath) throws SQLException, ClassNotFoundException {
File sourceFolder = new File(sourceFolderPath);
File targetFolder = new File(targetDirectoryPath + File.separator + sourceFolder.getName());
if (!targetFolder.exists()) {
targetFolder.mkdirs();
} else {
int count = 2;
while (targetFolder.exists()) {
String newFolderName = targetDirectoryPath + File.separator + sourceFolder.getName() + "-" + count;
targetFolder = new File(newFolderName);
count++;
}
targetFolder.mkdirs();
}
System.out.println("sourceFolderPath:" + sourceFolderPath + ", targetDirectoryPath:" + targetDirectoryPath);
File[] files = sourceFolder.listFiles();
for (File file : files) {
if (file.isFile()) {
File newFile = new File(targetFolder.getPath() + File.separator + file.getName());
try {
Files.copy(file.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}
} else if (file.isDirectory()) {
backupFolder(file.getPath(), targetFolder.getPath());
}
}
BackupInfoToDB.saveBackupFloderInfoToDB(sourceFolderPath, targetFolder.getPath());
return true;
}
5.6实现定时备份模块
java
public class BackupScheduler {
public void startScheduledBackup(String fileFolder, String backupFolder) throws InterruptedException {
System.out.println("fileFolder:"+fileFolder+";backupFolder:"+backupFolder);
Timer t = new Timer();
t.scheduleAtFixedRate(new MyTask(fileFolder,backupFolder),new Date(),1000*10);
for(int i = 0;i<10000;i++){
Thread.sleep(1000);
System.out.println("warning");
}
}
}
class MyTask extends TimerTask {
static String fileFolder;
static String backupFolder;
public MyTask(String fileFolder,String backupFolder){
this.fileFolder=fileFolder;
this.backupFolder=backupFolder;
}
@Override
public void run() {
Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String backupFolderPath = backupFolder + "\\" + df.format(d);
File dest = new File(backupFolderPath);
if (dest.exists()) {
deleteAll(dest);
}
System.out.println("创建备份目录?" + dest.mkdirs()+",,,,备份目录:"+backupFolderPath);
List<File> list = new ArrayList<>();
getAllFile(new File(fileFolder), list);
backUp(list, backupFolderPath);
try {
BackupInfoToDB.saveBackupFloderInfoToDB(fileFolder,backupFolderPath);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
5.7实现备份信息存储模块
java
public static Connection connection;
// 数据库信息
private static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/backup?useUnicode=true&characterEncoding=utf8";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "19720603";
/**
* @Description:将备份文件数据保存到数据库
* @Param backupFilePath:文件路径
* backupFolder:备份文件夹路径
* backupFileName:保存的备份文件名称
* @Return
*/
public static void saveBackupFileInfoToDB(String backupFilePath, String backupFolder, String backupFileName) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
String sql = "INSERT INTO backup_info (file_folder, file_name, backup_folder, backup_file_name, backup_time) VALUES (?, ?, ?, ?,?)";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, new File(backupFilePath).getParent());
stmt.setString(2, new File(backupFilePath).getName());
stmt.setString(3,backupFolder);
stmt.setString(4, backupFileName);
stmt.setTimestamp(5, new java.sql.Timestamp(new Date().getTime()));
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @Description:将备份文件夹数据保存到数据库
* @Param backupFilePath:文件路径
* backupFolder:备份文件夹路径
* @Return
*/
public static void saveBackupFloderInfoToDB(String backupFolderPath, String backupFolder) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
String sql = "INSERT INTO backup_info (file_folder, backup_folder, backup_time) VALUES (?, ?, ?)";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, backupFolderPath);
stmt.setString(2,backupFolder);
stmt.setTimestamp(3, new java.sql.Timestamp(new Date().getTime()));
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
6.系统测试
6.1备份文件模块测试
6.1.1备份文件不重名情况
图12 选择文件路径以及备份路径图
图13 备份文件不重名测试图
6.1.2备份文件重名情况
图14 备份文件重名测试图
6.2备份文件夹模块测试
6.2.1备份文件夹不重名情况
图15 选择文件夹路径以及备份路径图
图16 备份文件夹不重名测试图
6.2.2备份文件夹重名情况
图17 备份文件夹重名测试图
6.3定时备份模块测试
图18定时备份功能测试控制台图
图19定时备份效果图
6.4备份信息存储模块测试
图20 数据存储测试图
7.总结
在这次操作系统课程设计中,我成功地实现了一个基于Java GUI、MySQL和TimerTask的文件备份系统。通过设计和编码,我为用户提供了方便、高效的文件备份解决方案。这个系统不仅可以进行文件备份和文件夹备份,还支持定时备份功能,让用户可以轻松设置备份任务并保证数据的安全性和可靠性。
通过Java的文件操作类和TimerTask类的运用,我实现了文件备份和定时备份功能,并将备份数据存储到MySQL数据库中,为用户提供了查看备份历史记录的便利。这样的设计让用户可以在图形化界面下简单地进行文件备份操作,而且可以根据自己的需求灵活设置定时备份任务。
在未来,我认为可以进一步扩展系统功能,比如增加备份策略的定制、备份数据的压缩和加密等功能,以满足更多用户的需求。总的来说,这个文件备份系统为用户提供了一个简单高效的备份解决方案,具有较好的可扩展性和实用性,希望能够为用户带来便利和安全保障。通过这次设计,我也更加深入了解了Java GUI编程、MySQL数据库操作以及定时任务调度的实现,是一次非常有收获的实践经验。
参考文献
1.《操作系统设计与实现》(第二版),作者:Tanenbaum、Van Steen,出版社:机械工业出版社。
2.《计算机操作系统》(第三版),作者:汤小丹、陈向群、赵克立、杨卫东,出版社:高等教育出版社。