开发简易日记本时,富文本存储是核心需求之一,需要同时保存文字内容和格式信息,比如加粗、斜体、字体大小、颜色等属性。常见的富文本存储方案有数据库存储、文件存储、混合存储三类,不同方案适配不同的项目场景。

常见富文本存储方案对比
我们可以先了解不同存储方案的特点,再选择适合初级项目的方案:
| 存储方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 纯文件存储 | 实现简单,不需要额外依赖数据库 | 查询、管理日记内容不方便,格式解析复杂 | 日记数量少、不需要检索功能的项目 |
| 数据库存储 | 方便查询、排序、分类管理日记 | 需要引入数据库依赖,格式需要自定义规则 | 需要日记管理功能的常规项目 |
| 混合存储 | 格式文件单独存,数据库存索引和摘要 | 实现逻辑稍复杂,需要维护两套存储 | 日记内容多、对性能有要求的项目 |
适合初级项目的存储方案选择
对于初级Java日记本项目,推荐选择SQLite数据库存储方案,原因有三点:第一,SQLite是嵌入式数据库,不需要单独部署服务,只需要引入一个jar包就能使用;第二,数据库可以很方便地对日记进行按时间排序、按关键词检索等操作;第三,自定义简单的标记规则就能存储富文本格式,不需要引入复杂的富文本解析库。
具体实现步骤
1. 准备开发环境
首先需要在项目中引入SQLite的JDBC驱动,如果你使用Maven管理项目,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.41.2.2</version>
</dependency>
2. 设计数据库表结构
我们需要创建一张日记表,用来存储日记的基本信息和富文本内容,表结构设计如下:
-- 创建日记表
CREATE TABLE IF NOT EXISTS diary (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 日记唯一ID
title TEXT NOT NULL, -- 日记标题
content TEXT NOT NULL, -- 富文本内容的标记字符串
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 更新时间
);
3. 自定义富文本标记规则
为了简化实现,我们不需要存储完整的HTML内容,而是自定义简单的标记规则,比如用[b]表示加粗开始,[/b]表示加粗结束,[color=red]表示红色文字开始,[/color]表示颜色结束。示例标记内容如下:
今天天气很好,[b]心情很愉快[/b],出门看到了[color=red]红色的花[/color]。
4. 实现日记存储和读取功能
接下来编写Java代码,实现日记的保存和读取功能,首先是数据库连接工具类:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:sqlite:diary.db"; // 数据库文件路径,会在项目根目录生成diary.db文件
static {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL);
}
}
然后是日记实体类,用来封装日记数据:
public class Diary {
private Integer id;
private String title;
private String content; // 存储自定义标记后的富文本内容
private String createTime;
private String updateTime;
// 省略getter、setter和构造方法
}
最后是日记的数据访问类,实现新增日记和查询日记的功能:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DiaryDao {
// 保存新日记
public boolean saveDiary(Diary diary) {
String sql = "INSERT INTO diary (title, content) VALUES (?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, diary.getTitle());
ps.setString(2, diary.getContent());
return ps.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 查询所有日记
public List<Diary> getAllDiaries() {
List<Diary> diaryList = new ArrayList<>();
String sql = "SELECT id, title, content, create_time, update_time FROM diary ORDER BY create_time DESC";
try (Connection conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Diary diary = new Diary();
diary.setId(rs.getInt("id"));
diary.setTitle(rs.getString("title"));
diary.setContent(rs.getString("content"));
diary.setCreateTime(rs.getString("create_time"));
diary.setUpdateTime(rs.getString("update_time"));
diaryList.add(diary);
}
} catch (SQLException e) {
e.printStackTrace();
}
return diaryList;
}
}
5. 富文本标记解析显示
读取到日记的标记内容后,需要解析成对应的格式显示,这里简单实现标记解析的逻辑:
public class ContentParser {
// 简单解析标记内容,转换为带HTML格式的内容用于显示
public static String parseToHtml(String markedContent) {
if (markedContent == null) {
return "";
}
String html = markedContent;
// 替换加粗标记
html = html.replace("[b]", "<b>");
html = html.replace("[/b]", "</b>");
// 替换颜色标记,这里只处理red示例,其他颜色可以扩展
html = html.replace("[color=red]", "<span style='color:red'>");
html = html.replace("[/color]", "</span>");
return html;
}
}
方案扩展建议
这个方案是适合初级项目的简化实现,后续可以根据需求扩展:如果需要支持更多富文本格式,可以扩展标记规则,或者改用存储标准HTML内容;如果日记数量很多,可以给标题和创建时间添加索引提升查询速度;如果需要多设备同步,可以把SQLite换成MySQL等远程数据库。