大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

Posted 是蓝蓝的呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17相关的知识,希望对你有一定的参考价值。

黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\

大数据

目标:把mp3保存到数据库中!

my.ini中添加如下配置!

max_allowed_packet=10485760

1 什么是大数据

所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:

类型

长度

tinyblob

28--1B256B

blob

216-1B64K

mediumblob

224-1B16M

longblob

232-1B4G

tinyclob

28--1B256B

clob

216-1B64K

mediumclob

224-1B16M

longclob

232-1B4G

 

但是,在mysql中没有提供tinyclobclobmediumcloblongclob四种类型,而是使用如下四种类型来处理文本大数据:

类型

长度

tinytext

28--1B256B

text

216-1B64K

mediumtext

224-1B16M

longtext

232-1B4G

首先我们需要创建一张表,表中要有一个mediumblob16M)类型的字段。

 

CREATE TABLE tab_bin(

id INT PRIMARY KEY AUTO_INCREMENT,

filenameVARCHAR(100),

data MEDIUMBLOB

);

 向数据库插入二进制数据需要使用PreparedStatement为原setBinaryStream(int, InputSteam)方法来完成。

con = JdbcUtils.getConnection();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

InputStream in = new FileInputStream("f:\\a.jpg");

pstmt.setBinaryStream(2, in);

pstmt.executeUpdate();

 读取二进制数据,需要在查询后使用ResultSet类的getBinaryStream()方法来获取输入流对象。也就是说,PreparedStatementsetXXX(),那么ResultSet就有getXXX()

con = JdbcUtils.getConnection();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

 

String filename = rs.getString("filename");

OutputStream out = new FileOutputStream("F:\\" + filename);

 

InputStream in = rs.getBinaryStream("data");

IOUtils.copy(in, out);

out.close();

   还有一种方法,就是把要存储的数据包装成Blob类型,然后调用PreparedStatementsetBlob()方法来设置数据

con = JdbcUtils.getConnection();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

File file = new File("f:\\a.jpg");

byte[] datas = FileUtils.getBytes(file);//获取文件中的数据

Blob blob = new SerialBlob(datas);//创建Blob对象

pstmt.setBlob(2, blob);//设置Blob类型的参数

pstmt.executeUpdate();

con = JdbcUtils.getConnection();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

 

String filename = rs.getString("filename");

File file = new File("F:\\" + filename) ;

Blob blob = rs.getBlob("data");

byte[] datas = blob.getBytes(0, (int)file.length());

FileUtils.writeByteArrayToFile(file, datas);

上课老师敲的代码:

package cn.itcast.demo4;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.rowset.serial.SerialBlob;

import org.apache.commons.io.IOUtils;
import org.junit.Test;

import cn.itcast.demo3.JdbcUtils;

/**
 * 大数据
 * @author cxf
 *
 */
public class Demo4 {
    /**
     * 把mp3保存到数据库中。
     * @throws SQLException 
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    @Test
    public void fun1() throws Exception {
        /*
         * 1. 得到Connection
         * 2. 给出sql模板,创建pstmt
         * 3. 设置sql模板中的参数
         * 4. 调用pstmt的executeUpdate()执行
         */
        Connection con = JdbcUtils.getConnection();
        String sql = "insert into tab_bin values(?,?,?)";
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        pstmt.setInt(1, 1);
        pstmt.setString(2, "流光飞舞.mp3");
        /**
         * 需要得到Blob
         * 1. 我们有的是文件,目标是Blob
         * 2. 先把文件变成byte[]
         * 3. 再使用byte[]创建Blob
         */
        // 把文件转换成byte[]
        byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/流光飞舞.mp3"));
        // 使用byte[]创建Blob
        Blob blob = new SerialBlob(bytes);
        // 设置参数
        pstmt.setBlob(3, blob);
        
        pstmt.executeUpdate();
    }
    
    /**
     * 从数据库读取mp3
     * @throws SQLException 
     */
    @Test
    public void fun2() throws Exception {
        /*
         * 1. 创建Connection
         */
        Connection con = JdbcUtils.getConnection();
        /*
         * 2. 给出select语句模板,创建pstmt
         */
        String sql = "select * from tab_bin";
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        /*
         * 3. pstmt执行查询,得到ResultSet
         */
        ResultSet rs = pstmt.executeQuery();
        
        /*
         * 4. 获取rs中名为data的列数据
         */
        if(rs.next()) {
            Blob blob = rs.getBlob("data");
            /*
             * 把Blob变成硬盘上的文件!
             */
            /*
             * 1. 通过Blob得到输入流对象
             * 2. 自己创建输出流对象
             * 3. 把输入流的数据写入到输出流中
             */
            InputStream in = blob.getBinaryStream();
            OutputStream out = new FileOutputStream("c:/lgfw.mp3");
            IOUtils.copy(in, out);
        }
    }
}

 

以上是关于大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17的主要内容,如果未能解决你的问题,请参考以下文章

下载 mp3 文件,保存到磁盘,并作为 URL 读取

将 mp3 数据保存在 iPhone 上的文件中

C++中如何将两个连续的string 类型存入到文件中并读取出来?

分批次读取csv文件,并保存到数据库

如何以mp3格式保存数据流?

黑马基础阶段测试题:通过字符输入流读取info.txt中的所有内容,每次读取一行,将每一行的第一个文字截取出来并打印在控制台上。