设为首页 收藏本站
查看: 857|回复: 0

[经验分享] 使用db2 9x实现包含二进制文件内容的xml文档的存储和检索

[复制链接]

尚未签到

发表于 2016-11-17 08:10:14 | 显示全部楼层 |阅读模式
使用db29.x XML类型实现二进制数据的存储与检索

存储
Xml文档可以用<[!CDATA[]]>在文档内部来包含一些二进制方式的内容,如:可执行文件、pdf文档等等。
Db2 9x提供了对xml直接存储的支持,那么怎么样将二进制文件的内容写入到xml文档,并将文档保存到db2 数据库中呢?
实验的过程如下:
在db2中建一张包含xml字段的表,只包含2个字段,a,b,其中b为xml类型的字段;
使用如下的代码实现二进制xml文件的存储:
public static void insert(Connection cnn) throws Exception{
PreparedStatement preparedStatement =
cnn.prepareStatement("INSERT INTO admin.test VALUES(1,?)");
preparedStatement.setInt(1, 1);
String xml="<root><![CDATA[";//可以在xml文档中增加一些描述性的元素来说明二进制文件的摘要信息
//以下读取文件内容
StringBuffer m_cStrXML= new StringBuffer();
File cFileBinary = new File("c:\\\\test.chm");

int fSize = new Long(cFileBinary.length()).intValue();
byte[] fContent = new byte[fSize];
   
FileInputStream fis = new FileInputStream(cFileBinary);
int bRead;
String cStrByte=null;
if((bRead=fis.read(fContent,0,fSize))!=-1)
{
//非常关键的一步,将二进制编码
    m_cStrXML.append(new String(new Base64().encode(fContent)));
}
xml+=m_cStrXML.toString();
xml+="]]></root>";
preparedStatement.setString(1, xml);
int n = preparedStatement.executeUpdate();
cnn.commit();
}
检索
前面步骤完成了包含二进制内容的xml文档的存储,通过db2提供的xquery语法,可以对这个xml表的内容进行方便的检索,那么查到需要的文件后,怎么将二进制内容重新转换成合适的文件呢?
以下的代码假设已经知道了二进制文件的格式为chm文件,在实际的应用中,可以通过在xml文档中增加其他的摘要信息来描述二进制数据,比如:文件的格式、打开文件的格式,可以与DTD、Schema等XML工具来实现更强的功能。
恢复二进制文件的代码如下:
public static void read(Connection cnn) throws Exception{
//xs:string必须加上,否则返回的xml文档会包含xml Tag
PreparedStatement preparedStatement =
cnn.prepareStatement("select xmlquery('xs:string($xx/root)' passing b as \"xx\") from admin.test");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String xml = resultSet.getString(1);
//Base64解码
Base64 bs = new Base64();
byte[] bt = bs.decode(xml);
//以下输出到文件,假定文件为chm格式
File fileOutput = new File("C:\\\\test1.chm");
FileOutputStream fo = new FileOutputStream(fileOutput);
fo.write(bt);
fo.close();
System.out.println("chm retrieved");
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301385-1-1.html 上篇帖子: db2中会导致表处于reorg pending状态的alter语句 下篇帖子: 在WebSphere 6.1.0.25 和 DB2 v9.7 上部署 OpenCms 7.5.1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表