使用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类