这几天做的一个项目是将文件系统,存放于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 {
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";
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 {
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) {
e.printStackTrace();
* 将文件转化为Blob的对象
* create file 2 blob
* @param inFile
* @return
public static Blob file2Blob(String inFile){
try {
byte [] result = file2Byte(inFile);
BLOB blob = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
blob.setBytes(1, result);
return blob;
} catch (Exception e) {
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) {
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 {
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) {
e.printStackTrace();
try {
if (out != null) {
out.close();
} catch (IOException e) {
e.printStackTrace();
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
} catch (Exception e) {
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) {
e.printStackTrace();
return null;
这个是测试的图片,如果是word文档,就会是二进制的乱码了
作者 | Java圣斗士 | 原创图文,转载请注明出处全文约3000字(含代码),阅读需要10分钟,建议收藏哈喽大家好,欢迎关注Java圣斗士,每日编程课堂带你飞!有很多身处物联网或者通讯行业,以及一些智能硬件领域的小伙伴经常会需要和一些byte指令打交道,有时候需要将这些byte指令输出显示,或者存储起来,就需要将它们转换为十六进制的指令字符串。那么今天我们就来讨论一下如何将一个byte数组转化...
I want to fetch an image from database. For that I have created a byte array for an image, which is passed by a string, and now I want to convert that string into image format. I am assigning that ima...
本文纯属八卦,基本没有任何实用价值。Oracle总是都会通过SQL_ID来标志一个唯一的SQL。SQL_ID与SQL_TEXT一一对应。如果两个SQL文本有任何不同,包括空格等任何不可见字符,都会导致SQL_ID不同。本文八卦的内容是:Oracle如何根据SQL_TEXT内容散列成一个13位的字符串。为什么这个字符串会是13位?为什么这个字符经常以数字开头?本文参考TANEL PODER和Slav...
今天用java读取oracle里的Clob字段。本来要转成xml文件的,一顿转换。现在总结一下这个流的互相转换方法。一、byte[]=>Blob我们可以通过Hibernate提供的表态方法来实现如:org.hibernate.Hibernate.Hibernate.createBlob(new byte[1024]);二、Blob=>byte[]/*** 把Blob类型转换为byte数...
整数类型有byte、short、int、long。在不同位数的操作系统占用不同的字节。在64位操作系统中,它们分别占1、2、4、8个字节。
小数类型有float和double,在64位操作系统中分别占用4和8个字节。double的表示范围比float更大,精度更高。
问题的实际需求是读取oracle数据库表中RAW类型列值,并根据获取的值进行一些查询、插入操作。
首先oracle中RAW类型,在.NET 中等同于byte[],获取列值。
添加引用:
using System.Configuration;
using System.Data;
using Sys...
Oracle中的raw类型字段在java中如何转成字符Oracle中的raw类型对应Java中的byte数组工具类代码如下主测试方法如下
Oracle中的raw类型对应Java中的byte数组
在使用Java语言操作数据库中的raw的字段时,会发现获取到的是byte类型的数组,下面介绍如何使用原生的方法,将byte数组转成字符串类型,并且避免乱码。
工具类代码如下
public class Byt...
I当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们之间互换的util.
一、byte[]=>Blob
我们可以通过Hibernate提供的表态方法来实现如:
org.hibernate.Hibernate.Hibernate.createBlob(new byte[1024]);
二、Blob=>byte[]
目前没有找到好一点的API提供,所以只能自已来实现。示例如下:
* 把Blob类型转换为byte数组类型
* @param blob