使用JdbcUtils得到連接con
java.sql包下的Interface Blob----其實現類SerialBlob
Blob是一個可以存儲二進制文件的容器。
BLOB常常是數據庫中用來存儲二進制文件的字段類型。
MySQL中,BLOB是個類型系列,包括TinyBlob,Blob,MediumBlob,LongBlob,這幾個類型之間的唯一區別是在存儲文件的最大 大小上不同。
類型 大小(單位:字節)
TinyBlob 最大 255
Blob 最大 65k
MediumBlob 中等 16M
LongBlob 最大 4G
所需數據庫結構
1 //把MP3保存到數據庫中 2 @Test 3 public void fun() throws Exception{ 4 Connection con=JdbcUtils.getConnection(); 5 String sql="insert into tab_bin values(?,?,?)"; 6 PreparedStatement pstmt=con.prepareStatement(sql); 7 pstmt.setInt(1, 1); 8 pstmt.setString(2, "Circus.mp3"); 9 //需要得到blob 10 /*1.我們有的是文件,目標是Blob 11 * 2.先把文件變成byte[] 12 * 3.再使用byte[]創建Blob 13 * */ 14 //把文件轉換成byte[] 15 byte[] bytes=IOUtils.toByteArray(new FileInputStream("F:/CloudMusic/Circus.mp3")); 16 17 Blob blob=new SerialBlob(bytes); 18 //設置參數 19 pstmt.setBlob(3, blob); 20 21 pstmt.executeUpdate(); 22 }
從數據庫中讀MP3數據,然后寫到磁盤中
1 @Test 2 public void fun2() throws Exception{ 3 Connection con=JdbcUtils.getConnection(); 4 System.out.println(con); 5 String sql="select * from tab_bin where filename=?"; 6 PreparedStatement pstmt=con.prepareStatement(sql); 7 pstmt.setString(1, "Circus.mp3"); 8 ResultSet rs= pstmt.executeQuery(); 9 System.out.println("查詢成功"); 10 //獲取rs中的名為data的數據----數據庫中的名 11 if(rs.next()){ 12 Blob blob=rs.getBlob("data"); 13 /*把Blob變成硬盤上的文件 14 * 15 * 1.通過Blob得到輸入流對象 16 * 2.自己創建輸出流對象 17 * 3.把輸入流的數據寫入到輸出流中 18 * */ 19 InputStream in=blob.getBinaryStream();//讀 20 //寫 21 OutputStream out=new FileOutputStream("G:/金泰妍1.MP3"); 22 IOUtils.copy(in, out); 23 }
IOUtils是一個類---封裝了IO操作的相關類----提供了對流的操作
常用方法
copy這個方法可以拷貝流
copy(inputstream,outputstream)
copy(inputstream,writer)
copy(inputstream,writer,encoding)
copy(reader,outputstream)
copy(reader,writer)
copy(reader,writer,encoding)
copyLarge這個方法適合拷貝大的數據流,比如2G以上。
copyLarge(reader,writer) 默認會用1024*4的buffer來讀取
copyLarge(reader,writer,buffer)
read從一個流中讀取數據
read(inputstream,byte[]) read(inputstream,byte[],offset,length) //offset是buffer的偏移值,length是讀取的長度 read(reader,char[]) read(reader,char[],offset,length)
等等方法,見IOUtils類