没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2010-02-05 16:05:14.000|阅读 797 次
概述:最近几次碰到这个问题,需求是将一个文件或者文件流存储到Oracle数据库里,Oracle8提供了Blob和Clob用来存储二进制大对象数据,可是它和Java.sql.里面的Blob不兼容,经常导致Blob字段无法锁定或者操作失败,总之我总结了一些经验大家共享。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
最近几次碰到这个问题,需求是将一个文件或者文件流存储到Oracle数据库里,Oracle8提供了Blob和Clob用来存储二进制大对象数据,可是它和Java.sql.里面的Blob不兼容,经常导致Blob字段无法锁定或者操作失败,总之我总结了一些经验大家共享。
首先建立测试数据表
drop table filelist; commit; CREATE TABLE SYSTEM.FILELIST ( "FILENAME" VARCHAR2(50) NOT NULL, "FILESIZE" NUMBER(20) NULL, "FILEBODY" BLOB NULL, PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ; commit; |
测试过程,首先将硬盘文件读入数据库,然后再读出到硬盘的另一个新文件里,原码如下:
import java.io.*; import java.util.*; import java.sql.*; import oracle.sql.*; import oracle.jdbc.driver.*; import java.text.*; public class test { public static void main(String args[]) throws java.io.IOException,java.sql.SQLException { dbBean db1=new dbBean(); /** |
*这里是我的数据联接Bean *大家可以用自己的连接Bean */ byte a[]=null;//**将测试文件test.doc读入此字节数组 java.io.FileInputStream fin=null; java.io.FileOutputStream fout=null; oracle.jdbc.OracleResultSet ors=null;//**这里rs一定要用Oracle提供的 oracle.jdbc.driver.OraclePreparedStatement opst=null;//**PreparedStatement用 //Oracle提供的 try { java.io.File f1=new java.io.File("c:/temp/test.doc"); java.io.File f2=new java.io.File("c:/temp/testout.doc");//**从BLOB读出的信息写 //入该文件,和源文件对比测试用 fin=new java.io.FileInputStream(f1); fout=new java.io.FileOutputStream(f2); int flength=(int)f1.length();//**读入文件的字节长度 |
System.out.println("file length::"+flength); a=new byte[flength]; int i=0;int itotal=0; /**将文件读入字节数组 for (;itotal { i=fin.read(a,itotal,flength-itotal); } fin.close(); System.out.println("read itotal::"+itotal); /**注意Oracle的 BLOB一定要用EMPTY_BLOB()初始化 String mysql="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); opst.setInt (2,flength); opst.executeUpdate(); opst.clearParameters(); /**插入其它数据后,定位BLOB字段 mysql="select filebody from filelist where filename=?"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); ors=(oracle.jdbc.OracleResultSet)opst.executeQuery(); if (ors.next()) { oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段 int j=blob.putBytes(1,a);/**将字节数组写入BLOB字段 System.out.println("j:"+j); db1.conn.commit(); ors.close(); } System.out.println("insert into ok"); byte b[]=null;/**保存从BLOB读出的字节 opst.clearParameters(); mysql="select filebody from filelist where filename=?"; opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql); opst.setString(1,"wordtemplate"); ors=(oracle.jdbc.OracleResultSet)opst.executeQuery(); if (ors.next()) { oracle.sql.BLOB blob2=ors.getBLOB(1); System.out.println("blob2 length:"+blob2.length()); b=blob2.getBytes(1,flength);/**从BLOB取出字节流数据 System.out.println("b length::"+b.length); db1.conn.commit(); } ors.close(); /**将从BLOB读出的字节写入文件 |
fout.write(b,0,b.length); fout.close(); System.out.println("write itotal::"+b.length); } catch(Exception e) { System.out.println("errror :"+e.toString() ); e.printStackTrace(); } finally { /**关闭所有数据联接 stmt.close(); db1.closeConn(); } } } |
编译运行在TomCat下调试通过。
需要注意的是Blob存取的过程,一般先存入和BLOB相关的控制数据,如文件的名字,然后查询定位BLOB字段,利用OracleBlob提供的方法:
public int putBytes(long pos,byte bytes[]) public byte[] getBytes(long pos,byte bytes[]) |
或者利用
public OutputStream getBinaryOutputStream() throws SQLException public InputStream getBinaryStream() throws SQLException |
因为利用输入输出流总归还是利用到字节数组缓冲流,所以就不举例子了。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号