数据库存取BLOB类型音乐文件的过程及常见错误
生活随笔
收集整理的這篇文章主要介紹了
数据库存取BLOB类型音乐文件的过程及常见错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫存取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.獲取數據庫連接對象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定義sqlString sql = "insert into mymusic values(?,?)";//5.獲取執行sql語句的對象StatementPreparedStatement 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;
將數據庫存取的最大容量改為8M - show 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.獲取數據庫連接對象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定義sqlString sql = "select music from mymusic where id = ? ";//5.獲取執行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開始輸出,長度為數組的字長out.write(chs , 0 ,chs.length);}//流操作要closeout.close();in.close();}//8.釋放資源rs.close();pst.close();conn.close();} }運行后,進行刷新,完成音樂文件的讀取
播放成功
如果覺得這篇博客對你有些用處,希望支持一下啦!!
總結
以上是生活随笔為你收集整理的数据库存取BLOB类型音乐文件的过程及常见错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题55 - I.
- 下一篇: 码元,波特,速率,带宽