Oracle中的lob (Large Object)可以存儲(chǔ)非常大的數(shù)據(jù)(可能是4GB),這樣就可以通過(guò)將文件或其它任何對(duì)象序列化成字節(jié)輸出流(OutputStream)后寫(xiě)入數(shù)據(jù)庫(kù),之后使用字節(jié)輸入流(InputStream)將數(shù)據(jù)讀出然后反序列化為原始文件或?qū)ο蟆2僮鲿r(shí)需要使用oracle的JDBC包,它擴(kuò)展了sun的JDBC包中的Blob對(duì)象。同時(shí)需要注意一些細(xì)節(jié)。下面的代碼演示如何使用blob(實(shí)例中需要Oracle的JDBC包)。
1
import oracle.jdbc.OracleResultSet; // 使用Oracle的ResultSet對(duì)象
2
import oracle.sql.BLOB; // 使用Oracle的BLOB對(duì)象,而不是sun的Blob
3
4

5
6
try
{
7
Connection conn=<數(shù)據(jù)庫(kù)連接>;
8
File file=<存入數(shù)據(jù)庫(kù)的文件對(duì)象>;
9
conn.setAutoCommit(false); // 取消Connection對(duì)象的auto commit屬性
10
String file_name=file.getName();
11
12
// 數(shù)據(jù)庫(kù)中有一個(gè)item表,其中的file_name (varchar2)存儲(chǔ)文件名,file_blob (blob)存儲(chǔ)文件對(duì)象
13
String sql="INSERT INTO item (file_name,file_blob) VALUES ('" + file_name + "',EMPTY_BLOB())"; // 使用“EMPTY_BLOB()“成生一個(gè)空blob
14
Statement stmt=conn.createStatement();
15
int count=stmt.executeUpdate(sql);
16
17
sql="SELECT file_blob FROM item WHERE iid='" + iid + "' FOR UPDATE"; // 使用“FOR UPDATE”得到表的寫(xiě)鎖
18
ResultSet rs=stmt.executeQuery(sql);
19
rs.next();
20
BLOB blob=((OracleResultSet)rs).getBLOB("file_blob"); // 得到BLOB對(duì)象
21
OutputStream out=blob.getBinaryOutputStream(); // 建立輸出流
22
InputStream in=new FileInputStream(file); // 建立輸入流
23
int size=blob.getBufferSize();
24
byte[] buffer=new byte[size]; // 建立緩沖區(qū)
25
int len;
26
while((len=in.read(buffer)) != -1)
27
out.write(buffer,0,len);
28
in.close();
29
out.close();
30
31
conn.commit();
32
}
33
catch(Exception ex)
{
34
try
{
35
conn.rollback();
36
}
37
catch(SQLException sqle)
{
38
System.err.println(sqle.getMessage());
39
}
40
}
41
42

2

3

4


5

6



7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33



34



35

36

37



38

39

40

41

42

如果要讀出文件的話只需調(diào)用BLOB的getBinaryStream()生成一個(gè)輸入流,再寫(xiě)入一個(gè)文件就行了。