Java之Byte和blob相互转换(Oracle)-yellowcong

30 篇文章 0 订阅

这几天做的一个项目是将文件系统,存放于oracle中,这时候插入数据库的方式有两种,一种是直接的插入Byte,另一种就是插入blob对象,文章中我会写到如何将byte和blob相互转化。

环境搭建

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.1.0.7.0</version>
    <scope>test</scope>
</dependency>

数据库

create table WORD_FILE
(
  gyo_num       NUMBER(6),
  word_kb       CHAR(6),
  word_filename VARCHAR2(80),
  biko          VARCHAR2(80),
  WORD_FILE      BLOB,
  usr_id        VARCHAR2(20),
  ymdt          DATE
)

实现代码

创建blob需要通过BLOB.createTemporary的方法来创建,然后通过setByte的方法来设定Blob里面的数据

package com.yellowcong.utils;

import java.io.File;
import java.io.FileInputStream;
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.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.sql.BLOB;

public class DbBlobTest {

    private static final String DB_URL = "jdbc:oracle:thin:@10.0.7.170:1522:ORCL5";

    private static final String DB_USER = "test";

    private static final String DB_PASSWORD = "test";

    private static Connection conn = null;

    public static void main(String[] args) throws Exception {
            // insert into blob
            Connection conn = getConnection();

            PreparedStatement ps = conn
                    .prepareStatement("INSERT INTO WORD_FILE (GYO_NUM,WORD_KB,WORD_FILENAME,BIKO,USR_ID,YMDT,WORD_FILE) values (6,'KYK002','20171114test.doc','備考','VENAS',TO_DATE('17-11-14','RR-MM-DD'),?)");

            String inFile = "C:/Users/zhangrw/Desktop/test/2nANQz3wsFN8rkrTZa5P8xQY8PRBhyHw.jpg";

            //设定的是blob类型
            ps.setBlob(1, file2Blob(inFile));
            ps.executeUpdate();
    }

    /**
     * test blob data 2 file
     * @throws Exception
     */
    public static void testBlob2File() throws Exception{
        Connection conn = getConnection();

        PreparedStatement ps = conn
                .prepareStatement("select * from WORD_FILE a ");

        ResultSet rs = ps.executeQuery();
        int index = 1;
        while (rs.next()) {
            Blob bl = rs.getBlob("WORD_FILE");
            String outFile = "C:/Users/zhangrw/Desktop/test/dou_"+(index++)+".doc";

            blob2File(bl,outFile);
        }
    }
    /**
     * upload file
     * 通过二进制的方式来上传文件
     */
    public static void testFile2byte(){
        try {
            // insert into blob
            Connection conn = getConnection();

            PreparedStatement ps = conn
                    .prepareStatement("INSERT INTO WORD_FILE (GYO_NUM,WORD_KB,WORD_FILENAME,BIKO,USR_ID,YMDT,WORD_FILE) values (4,'KYK002','20171114test.doc','備考','VENAS',TO_DATE('17-11-14','RR-MM-DD'),?)");

            String inFile = "C:/Users/zhangrw/Desktop/test/2nANQz3wsFN8rkrTZa5P8xQY8PRBhyHw.jpg";

            byte [] result = file2Byte(inFile);
            //设定的是自己码文件
            ps.setBytes(1, result);
            ps.executeUpdate();
        } catch (SQLException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

    }
    /**
     * 将文件转化为Blob的对象
     * create file 2 blob
     * @param inFile
     * @return
     */
    public static Blob file2Blob(String inFile){

        try {

            byte [] result = file2Byte(inFile);
            //creat a new blob
            BLOB blob = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);

            //set start is 1
            //这个setBytes 是指定起点,然后设定字节
            blob.setBytes(1, result);

            //pub byte 这个方法是添加byte
//          blob.putBytes(1, result);

            return blob;
        } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将文件转化为二进制的数据
     * create file 2 byte
     * @param inFile
     * @return
     */
    public static byte[] file2Byte(String inFile){
        InputStream in = null;
        try {
            in = new FileInputStream(new File(inFile));

            int len = in.available();
            byte [] result = new byte[len];
            in.read(result);

            return result;
        } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return null;

    }
    /**
     * 将Blob文件转化为Blob对象
     * convert blob to file
     * @param blob
     * @param outFile
     */
    public static void blob2File(Blob blob, String outFile) {
        InputStream in = null;
        OutputStream out = null;
        try {
                //通过getBinaryStream 方法获取输入流
            in = blob.getBinaryStream();
            out = new FileOutputStream(new File(outFile));
            byte [] buff = new byte[1024];
            int len =0;
            while((len = in.read(buff)) > 0){
                out.write(buff, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
    }

    static {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");

            conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
        } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {

        try {
            if (conn == null) {
                Class.forName("oracle.jdbc.driver.OracleDriver");

                conn = DriverManager
                        .getConnection(DB_URL, DB_USER, DB_PASSWORD);
            }
            return conn;
        } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

        return null;
    }
}

上传结果

这个是测试的图片,如果是word文档,就会是二进制的乱码了
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂飙的yellowcong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值