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

 

转载于:https://www.cnblogs.com/xjs1874704478/p/10718389.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐