前言
上次写了一个用JDBC向数据库存取小说等大文本的案例用到了PreparedStatement和io流的相关知识。Java使用JDBC向数据库存取大文本(比如小说等)
https://blog.csdn.net/weixin_50216991/article/details/120642592今天我又想起了数据库还可以存取图片,视频,音频等的二进制数据文件,按理来说说任何文件都可以存进数据库。其实和上一期的写法差不多啦,只是数据库存储数据的数据类型和io流不一样罢了,用到的是PreparedStatement的setBinaryStream()这个方法,而不是setCharacterStream()。我也借此机会顺便巩固一下jdbc和io流。
前提知识点
MySQL数据库有一个BLOB的数据类型,是一个可以存储二进制文件的容器,BLOB类型的文件可以是任何文件。
MySQL有4种BLOB类型,如下:
类型 | 大小(单位:字节) |
---|---|
TinyBlob | 最大 255k |
Blob | 最大 65K |
MediumBlob | 最大 16M |
LongBlob | 最大 4G |
这里要测试存取音频或图片,我就用MediumBlob吧。
io流用FileInputStream就行,其他都和上篇一样。
具体实现步骤
1.打开MySQL,并创建一个名为files的数据库,然后创建数据表。
代码如下(示例):
代码语言:javascript复制create database files default character set = "utf8mb4";
代码语言:javascript复制create table myFile(
id int primary key ,
file mediumblob
);
2.将文件写入到数据库中myFile表的file字段。
创建普通Java项目,把MySQL的jdbc驱动的jar包下载后,导入到项目中,在src目录下创建一个WriteAndReadFile类,D盘根目录下有一个的音频萤火之森.mp3,假设我们就是要把它存入数据库中。然后编WriteAndReadFile类。这次的代码可能不会有那么多注释了,如果你不理解的话就去看我上一篇文章吧。
实现代码如下(示例):
代码语言:javascript复制import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class WriteAndReadFile {
//定义方法把文件写入MySQL数据库
public static void writeFileToMySQL(){
Connection conn=null;
PreparedStatement ps=null;
int result = 0;
String dbDriver="com.mysql.cj.jdbc.Driver";
String URL="jdbc:mysql://localhost:3306/files";
String user="root";
String pwd="zc20020106";
try {
Class.forName(dbDriver);
conn=DriverManager.getConnection(URL,user,pwd);
String sql="insert into myFile(id, file) values (?,?)";
ps=conn.prepareStatement(sql);
ps.setInt(1,1);
File file =new File("D:\idm_download\萤火之森.mp3");
//用FileInputStream来存文件
InputStream in = new FileInputStream(file);
ps.setBinaryStream(2,in,(int)file.length());
result= ps.executeUpdate();
in.close();
if (result>0){
System.out.println("音频文件写入成功!");
}else {
System.out.println("音频文件写入失败!");
}
}catch (Exception e){
e.printStackTrace();
}finally {
//释放资源
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
writeFileToMySQL();
}
}
运行代码:
3.读取数据库里的音频
思路:通过ResultSet的getBinaryStream()方法读取音频,然后通过io流写入到硬盘(src目录下)
代码如下:
代码语言:javascript复制import java.io.*;
import java.sql.*;
public static void ReadFileToLocal(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
String dbDriver="com.mysql.cj.jdbc.Driver";
String URL="jdbc:mysql://localhost:3306/files";
String user="root";
String pwd="zc20020106";
try {
Class.forName(dbDriver);
conn=DriverManager.getConnection(URL,user,pwd);
String sql="select * from myfile where id=?";
ps=conn.prepareStatement(sql);
ps.setInt(1,1);
rs= ps.executeQuery();
if (rs.next()){
InputStream in=rs.getBinaryStream("file");
OutputStream out=new FileOutputStream("src//萤火之森.mp3");
byte[] temp=new byte[1024];
int len=-1;
while ((len=in.read(temp))!=-1){
out.write(temp);
}
in.close();
out.close();
System.out.println("音频文件读取成功!");
}
}catch (Exception e){
e.printStackTrace();
}finally {
//释放资源
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
ReadFileToLocal();
}
}
运行代码:
成功取出!
播放完全没问题·!
我的JDBC基础的学习在这里就画下的句号了!学习新知识去喽。