前言
上次写了一个用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类型,如下:
这里要测试存取音频或图片,我就用MediumBlob吧。
io流用FileInputStream就行,其他都和上篇一样。
具体实现步骤
1.打开MySQL,并创建一个名为files的数据库,然后创建数据表。
代码如下(示例):
create database files default character set = "utf8mb4";
create table myFile( id int primary key , file mediumblob );
2.将文件写入到数据库中myFile表的file字段。
创建普通Java项目,把MySQL的jdbc驱动的jar包下载后,导入到项目中,在src目录下创建一个WriteAndReadFile类,D盘根目录下有一个的音频萤火之森.mp3,假设我们就是要把它存入数据库中。然后编WriteAndReadFile类。这次的代码可能不会有那么多注释了,如果你不理解的话就去看我上一篇文章吧。
实现代码如下(示例):
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目录下)
代码如下:
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(); } }
运行代码: