数据库存取BLOB类型音乐文件的过程及常见错误
数据库端的准备工作:
新建表,用来存放音乐文件:mymusic
第一列:id 类型:int
第二列:music 类型:blob
将音乐文件存入数据库
/**
*
*/
package cn.zxm.jsp;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
/**
* @author Miao
*
*/
public class JDBCBlobTest {
//通过JDBC存储二进制类型(音乐)
//BLOB
//存入音乐的内容
//1.先通过 pst 的 ? 代替音乐内容
//2.在通过 pst.setBinaryStream(2, in, (int)file.length());将上一步的? 代替成 二进制数据流
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//反射
//3.获取数据库连接对象Connection
java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");
//4.定义sql
String sql = "insert into mymusic values(?,?)";
//5.获取执行sql语句的对象Statement
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, 1);
//InputStreamReader转换流可以设置编码
File file = new File("D:\\goodbye.mp3");
//设置BLOB类型,setBinaryStream
//字节流
InputStream in = new FileInputStream(file);
pst.setBinaryStream(2, in, (int)file.length());
//执行sql,接受返回结果
int count = pst.executeUpdate();
//处理结果
System.out.println("受影响行数:"+ count);
//释放资源
in.close();
pst.close();
conn.close();
}
}
JDBCBlobTest.java运行时出现的错误:
** 1. 这里显示我存的数据超过了数据库存取的最大容量:这里需要修改MySQL数据库的最大容量
解决方法:**
SET GLOBAL max_allowed_packet=8*1024*1024;
将数据库存取的最大容量改为8Mshow VARIABLES like '%max_allowed_packet%';
查看数据库存取的最大容量
问题解决!!
2. 使用BLOB类型进行数据存储,BLOB存储空间不够
解决完第一个问题后,又出现新的错误,虽然英文不好,但是"Data too long"还是知道的,类型明明是BLOB类型了,怎么存储空间还不够4M吗?然后把错误去百度一搜,发现解决办法都是关于编码的问题,但是音乐文件以二进制形式存取和编码没有关系。于是就想,BLOB不够4M,还有没有其他的比BLOB更大的数据类型,就去Navicat找更高大上的类型,结果,真的有
后来,查了一下BLOB的最大存储大小:
TinyBlob:255B
Blob:65K
MediumBlob:16M
LongBlob:4G
最后,程序成功运行了
控制台:
数据库:
将音乐文件从数据库中取出:
/**
*
*/
package cn.tx.jsp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @author 11441
*
*/
public class JDBCBlobReader {
//取出音乐的内容
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");//反射
//3.获取数据库连接对象Connection
java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");
//4.定义sql
String sql = "select music from mymusic where id = ? ";
//5.获取执行sql语句的对象Statement
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, 1);
ResultSet rs = pst.executeQuery();
//读取
if(rs.next()) {
InputStream in = rs.getBinaryStream("music");
//通过io流输出
//读到哪里
OutputStream out = new FileOutputStream("src/music.mp3");
byte[] chs = new byte[100];
int len = -1;
while( (len = in.read(chs)) != -1 ) {
//输出,从0开始输出,长度为数组的字长
out.write(chs , 0 ,chs.length);
}
//流操作要close
out.close();
in.close();
}
//8.释放资源
rs.close();
pst.close();
conn.close();
}
}
运行后,进行刷新,完成音乐文件的读取
播放成功
如果觉得这篇博客对你有些用处,希望支持一下啦!!