Oralce的BFILE数据类型与JDBC操作BFILE数据类型的方法整理

一、Oracle的BFILE数据类型简介

1. BFILE数据类型介绍

  • BFILE类型是Oracle数据库中LOB类型的一种
  • BFILE字段存放指向操作系统文件的指针
  • BFILE字段只支持只读访问
  • BFILE字段支持最大2^64-1 bytes文件
  • BFILE字段指向的文件不是数据库的一部份,只能在数据库外维护
  • 对BFILE字段操作要使用BFILENAME函数
  • 读取BFILE字段需要使用DBMS_LOB包

2、BFILENAME函数介绍

  • BFILENAME函数语法如下

Description of bfilename.eps follows

  • BFILENAME函数有两个参数 'directory','filename
  • 'directory'参数是大小写敏感的
  • 'directory'参数所指定的目录必须在dba_directories中存在

二、创建包含BFILE字段的表

1、新建目录/tmp/bfile

[oracle@localhost ~]$ mkdir -p /tmp/bfile/

2、创建directory

SQL> create directory BFILEDIR as '/tmp/bfile';

3、新建两个文件

[oracle@localhost ~]$ cd /tmp/bfile/
[oracle@localhost bfile]$ pwd
/tmp/bfile
[root@db2 bfile]# ls -l
total 8
-rw-r--r-- 1 root root 51 Nov  7 18:10 aaa.txt
-rw-r--r-- 1 root root 52 Nov  7 18:11 bbb.txt
[oracle@localhost bfile]$ cat aaa.txt 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[oracle@localhost bfile]$ cat bbb.txt 
aaaaaaa
bbbbbb
ccccccc
dddddddd
111111
22222
333333

4、创建表

SQL> CREATE TABLE "TANGYIBO"."t_oralce_bfile" ( "id" NUMBER NOT NULL ENABLE,"file" BFILE, PRIMARY KEY ("id")) ;
Table created.

 

5、初始化表数据

SQL>INSERT INTO "TANGYIBO"."t_oralce_bfile" ("id", "file") VALUES ('1', BFileName('BFILEDIR', 'aaa.txt'));
SQL>INSERT INTO "TANGYIBO"."t_oralce_bfile" ("id", "file") VALUES ('2', BFileName('BFILEDIR', 'bbb.txt'));
SQL> commit;

 

三、JDBC方式读取oracle的BFILE类型数据

 private void getBFile() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try
        {
            String driver = "oracle.jdbc.driver.OracleDriver";
            String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
            Class.forName(driver);
            conn = DriverManager.getConnection(url, "tangyibo", "123456");
            System.out.println("connect");

            stmt = conn.createStatement();
            String sql = "SELECT \"id\",\"file\" FROM \"TANGYIBO\".\"t_oralce_bfile\" ";
            rs = stmt.executeQuery(sql);
            System.out.println("sql="+sql);
            while (rs.next()) { 
                BFILE b = (BFILE)rs.getObject(1);
                OutputStream ops = null;
                InputStream ips = null;
 
                //getName() only for BFILE
                File file = new File("d:"+File.separator+b.getName());
                try {
                    //fileExists() only for BFILE
                    System.out.println("isFileExist = "+b.fileExists());

                    //For BFILE,must open File,and close File after its operation 
                    //for BLOB,needn’t openFile() and closeFile()
                    b.openFile();                  
                    ips = b.getBinaryStream();
                    byte[] buffer =new byte[b.getBytes().length];//
                    ops = new FileOutputStream(file);
                    //将文件写到硬盘
                    for (int i; (i = ips.read(buffer)) > 0;) {                      
                        ops.write(buffer, 0, i);
                        ops.flush();
                    }

                    b.closeFile();
                }
                catch (Exception ex) {
                    ex.printStackTrace(System.out);
                }
                finally {
                    ips.close();
                    ops.close();
                }
            }
        }
        catch (Exception ex) {
            ex.printStackTrace(System.out);
        }
        finally {
            try {
                if(rs!=null) {
                   rs.close();
                }
                if(stmt!=null) {
                   stmt.close();
                }
                if(conn!=null) {
                   conn.close();
                }
            }
            catch (SQLException ex) {
               ex.printStackTrace(System.out);
            }
        }
}

四、参考文章

1、https://blog.csdn.net/baobing726/article/details/89048584

2、https://my.oschina.net/liuyuanyuangogo/blog/151215

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值