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");
}
上传二进制数据到oracle数据库
最新推荐文章于 2023-07-17 00:39:57 发布