使用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 @Test3 public void fun() throwsException{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.我们有的是文件,目标是Blob11 * 2.先把文件变成byte[]12 * 3.再使用byte[]创建Blob13 **/
14 //把文件转换成byte[]
15 byte[] bytes=IOUtils.toByteArray(new FileInputStream("F:/CloudMusic/Circus.mp3"));16
17 Blob blob=newSerialBlob(bytes);18 //设置参数
19 pstmt.setBlob(3, blob);20
21 pstmt.executeUpdate();22 }
从数据库中读MP3数据,然后写到磁盘中
1 @Test2 public void fun2() throwsException{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类