数据库存取BLOB类型音乐文件的过程及常见错误
數(shù)據(jù)庫存取BLOB類型音樂文件的過程及常見錯誤
數(shù)據(jù)庫端的準(zhǔn)備工作:
新建表,用來存放音樂文件:mymusic
第一列:id 類型:int
第二列:music 類型:blob
將音樂文件存入數(shù)據(jù)庫
/*** */ 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存儲二進(jìn)制類型(音樂)//BLOB//存入音樂的內(nèi)容//1.先通過 pst 的 ? 代替音樂內(nèi)容//2.在通過 pst.setBinaryStream(2, in, (int)file.length());將上一步的? 代替成 二進(jìn)制數(shù)據(jù)流 public static void main(String[] args) throws Exception {//1.注冊驅(qū)動Class.forName("com.mysql.jdbc.Driver");//反射//3.獲取數(shù)據(jù)庫連接對象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定義sqlString sql = "insert into mymusic values(?,?)";//5.獲取執(zhí)行sql語句的對象StatementPreparedStatement pst = conn.prepareStatement(sql);pst.setInt(1, 1);//InputStreamReader轉(zhuǎn)換流可以設(shè)置編碼File file = new File("D:\\goodbye.mp3");//設(shè)置BLOB類型,setBinaryStream//字節(jié)流InputStream in = new FileInputStream(file);pst.setBinaryStream(2, in, (int)file.length());//執(zhí)行sql,接受返回結(jié)果int count = pst.executeUpdate();//處理結(jié)果System.out.println("受影響行數(shù):"+ count);//釋放資源in.close();pst.close();conn.close();} }JDBCBlobTest.java運(yùn)行時出現(xiàn)的錯誤:
** 1. 這里顯示我存的數(shù)據(jù)超過了數(shù)據(jù)庫存取的最大容量:這里需要修改MySQL數(shù)據(jù)庫的最大容量
解決方法:**
- SET GLOBAL max_allowed_packet=8*1024*1024;
將數(shù)據(jù)庫存取的最大容量改為8M - show VARIABLES like '%max_allowed_packet%';
查看數(shù)據(jù)庫存取的最大容量
問題解決!!
2. 使用BLOB類型進(jìn)行數(shù)據(jù)存儲,BLOB存儲空間不夠
解決完第一個問題后,又出現(xiàn)新的錯誤,雖然英文不好,但是"Data too long"還是知道的,類型明明是BLOB類型了,怎么存儲空間還不夠4M嗎?然后把錯誤去百度一搜,發(fā)現(xiàn)解決辦法都是關(guān)于編碼的問題,但是音樂文件以二進(jìn)制形式存取和編碼沒有關(guān)系。于是就想,BLOB不夠4M,還有沒有其他的比BLOB更大的數(shù)據(jù)類型,就去Navicat找更高大上的類型,結(jié)果,真的有
后來,查了一下BLOB的最大存儲大小:
TinyBlob:255B
Blob:65K
MediumBlob:16M
LongBlob:4G
最后,程序成功運(yùn)行了
控制臺:
數(shù)據(jù)庫:
將音樂文件從數(shù)據(jù)庫中取出:
/*** */ 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 {//取出音樂的內(nèi)容public static void main(String[] args) throws Exception {//1.注冊驅(qū)動Class.forName("com.mysql.jdbc.Driver");//反射//3.獲取數(shù)據(jù)庫連接對象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定義sqlString sql = "select music from mymusic where id = ? ";//5.獲取執(zhí)行sql語句的對象StatementPreparedStatement 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開始輸出,長度為數(shù)組的字長out.write(chs , 0 ,chs.length);}//流操作要closeout.close();in.close();}//8.釋放資源rs.close();pst.close();conn.close();} }運(yùn)行后,進(jìn)行刷新,完成音樂文件的讀取
播放成功
如果覺得這篇博客對你有些用處,希望支持一下啦!!
總結(jié)
以上是生活随笔為你收集整理的数据库存取BLOB类型音乐文件的过程及常见错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题55 - I.
- 下一篇: MySQL小问题:cant connec