日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库存取BLOB类型音乐文件的过程及常见错误

發(fā)布時間:2024/7/19 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库存取BLOB类型音乐文件的过程及常见错误 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。