上传二进制数据到oracle数据库

import java.io.File;
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.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;

/**
 * 二进制文件的上传和下载
 * @author longxia
 * @version 2013-10-22 17:05:57
 * @since
 */
public class BlobDemo {
	{
		getConnection();
	}
	private static Connection conn = null ;
	/**
	 * 数据库写入
	 */
	public boolean readFile(String filePath){
		System.out.println("写入数据库");
		//需要写入的文件
		File file = new File(filePath);
		Statement pst = null;
		//缓冲区,大小要和文件大小一样
		byte[] buff = new byte[(int)file.length()];
		try {
			//获得输入流
			InputStream is = new FileInputStream(file);
			pst = conn.createStatement();
			//先插入一条信息,二进制那使用 empty_blob()代替
			pst.executeUpdate("insert into cc_blob(id,name,files) values('1','"+file.getName()+"',empty_blob())");
			//使用查询语句,要带for update
			ResultSet rs = pst.executeQuery("select files from cc_blob where name ='"+file.getName()+"' for update");
			OutputStream out = null;
			if(rs.next()){
				//获得blob对象
				oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("files");
				//通过blob获得输出流
				out = blob.getBinaryOutputStream();
				//先将文件写入缓冲区
				is.read(buff);
				//将缓冲区的内容写入数据库
				out.write(buff);
				System.out.println("写入成功");
			}
			is.close();
			out.close();
			conn.commit();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return true;
	}
	/**
	 * 读取数据库,并写成文件
	 */
	public boolean writeFile(String  filepath){
		System.out.println("写成文件");
		//缓冲区
		byte[] tempbuff = null;
		Statement st = null;
		File file = new File(filepath);
		try {
			st = conn.createStatement();
			//查询数据字典
			ResultSet rs = st.executeQuery("select files from cc_blob where id = '1'");
			if(rs.next()){
				//通过操作blob来实现查询二进制数据
				java.sql.Blob blob = rs.getBlob("files");
				//获得in
				InputStream in = blob.getBinaryStream();
				//获得out
				OutputStream out = new FileOutputStream(file);
				//设置缓冲区大小(如果不设置缓冲区大小,in的read方法是无用的)
				tempbuff = blob.getBytes(1, (int)blob.length());
				//将内存中的数据读入缓冲区
				in.read(tempbuff);
				//再将缓冲区的数据写入文件
				out.write(tempbuff);
				//关闭输入流和输出流
				in.close();
				out.close();
				System.out.println("写入成功");
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 获取数据库连接
	 */
	private Connection getConnection(){
		
		try {
			if(conn != null){
				return conn;
			}
			//通过反射创建驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//获取连接
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:bhdb","bhdb","bhdb08");
			//关闭自动提交
			conn.setAutoCommit(false);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("创建类失败");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("连接数据库失败");
		}
		return conn;
	}
	
	public static void main(String[] args){
		//数据库连接
//		System.out.println(new BlobDemo().getConnection());
		//写入文件
//		new BlobDemo().readFile("E:\\aa.txt");
		//写出文件
		new BlobDemo().writeFile("E:\\bbb.txt");
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值