上一篇

Java程序保存信息可通过文件存储(如文本或二进制文件)、数据库操作(JDBC连接MySQL等)、内存缓存(如Redis)或对象序列化实现,具体方式取决于数据规模、持久性需求及访问效率。
文件存储(适合小型数据或配置)
文本文件(如TXT、CSV)
import java.io.FileWriter;
import java.io.IOException;
public class FileStorage {
public static void saveToFile(String data, String filePath) {
try (FileWriter writer = new FileWriter(filePath, true)) { // true表示追加模式
writer.write(data + "n"); // 写入数据并换行
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
saveToFile("用户登录:2025-10-01", "log.txt");
}
}
- 优点:简单直接,无需外部依赖。
- 缺点:并发读写需手动加锁,大文件效率低。
- 场景:日志记录、配置文件。
数据库存储(结构化数据首选)
JDBC操作MySQL
import java.sql.*;
public class DatabaseStorage {
public static void saveUser(String name, String email) {
String url = "jdbc:mysql://localhost:3306/mydb";
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(url, "user", "pass");
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, name); // 防SQL注入
stmt.setString(2, email);
stmt.executeUpdate(); // 执行插入
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 关键点:
- 使用
PreparedStatement防止SQL注入。 - 连接池推荐(如HikariCP)提升性能。
- 使用
- 场景:用户信息、订单等结构化数据。
ORM框架(Hibernate/JPA)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter/Setter省略
}
// 保存操作
User user = new User();
user.setName("张三");
user.setEmail("zhangsan@example.com");
entityManager.persist(user); // 自动生成SQL并执行
- 优点:对象化操作,减少手动SQL。
- 工具推荐:Spring Data JPA、MyBatis。
序列化(Java对象持久化)
import java.io.*;
public class SerializationDemo {
public static void serialize(Object obj, String filePath) {
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(filePath))) {
oos.writeObject(obj); // 对象转二进制
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
User user = new User("李四", "lisi@example.com");
serialize(user, "user.dat");
}
}
- 注意:
- 类需实现
Serializable接口。 - 版本号
serialVersionUID需显式声明避免兼容问题。
- 类需实现
- 场景:缓存对象、进程间传输。
键值存储(高性能缓存/会话数据)
Redis示例(使用Jedis)
import redis.clients.jedis.Jedis;
public class RedisStorage {
public static void saveSession(String userId, String sessionData) {
try (Jedis jedis = new Jedis("localhost", 6379)) {
jedis.setex("session:" + userId, 3600, sessionData); // 设置1小时过期
}
}
}
- 优势:内存级读写(微秒级响应),支持过期策略。
- 场景:用户会话、热点数据缓存。
- 工具延伸:Spring Cache + Redis注解化集成。
云存储与NoSQL(海量数据/灵活结构)
MongoDB文档存储
// Spring Data MongoDB示例
@Document(collection = "products")
public class Product {
@Id
private String id;
private String name;
private double price;
}
public interface ProductRepository extends MongoRepository<Product, String> {}
// 保存数据
Product product = new Product("手机", 3999.0);
productRepository.save(product);
- 适用场景:JSON文档、物联网数据、内容管理系统。
对象存储(阿里云OSS/MinIO)
// 阿里云OSS SDK示例
InputStream stream = new FileInputStream("photo.jpg");
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
ossClient.putObject("my-bucket", "user_photos/001.jpg", stream);
ossClient.shutdown();
- 场景:图片、视频等二进制文件。
安全与性能最佳实践
- 加密敏感数据
- 使用
AES或RSA加密存储(如Jasypt库集成)。
- 使用
- 防注入攻击
- SQL:永远用
PreparedStatement。 - NoSQL:过滤特殊字符(如、)。
- SQL:永远用
- 并发控制
- 文件:
java.nio.channels.FileLock。 - 数据库:事务隔离级别(如
@Transactional)。
- 文件:
- 备份机制
- 数据库:定时快照(RDS自动备份)。
- 文件:增量同步到云存储。
如何选择存储方案?
| 需求类型 | 推荐方案 | 案例 |
|---|---|---|
| 小规模配置/日志 | 文本/Properties文件 | 应用配置 |
| 结构化业务数据 | MySQL/PostgreSQL + JDBC | 用户管理系统 |
| 高并发读缓存 | Redis/Memcached | 购物车会话 |
| 海量非结构化数据 | MongoDB/Cassandra | 商品评论 |
| 二进制大文件 | 云存储(OSS/S3) | 用户上传图片 |
引用说明:本文代码示例基于JDK 17、MySQL 8.0官方驱动、Spring Data 3.0及阿里云OSS SDK编写,安全实践参考OWASP Java安全指南,技术选型建议参考各数据库2025年性能基准测试报告[1][2]。


