Oracle中的lob (Large Object)可以存儲非常大的數據(可能是4GB),這樣就可以通過將文件或其它任何對象序列化成字節輸出流(OutputStream)后寫入數據庫,之后使用字節輸入流(InputStream)將數據讀出然后反序列化為原始文件或對象。操作時需要使用oracle的JDBC包,它擴展了sun的JDBC包中的Blob對象。同時需要注意一些細節。下面的代碼演示如何使用blob(實例中需要Oracle的JDBC包)。
1
import oracle.jdbc.OracleResultSet; // 使用Oracle的ResultSet對象
2
import oracle.sql.BLOB; // 使用Oracle的BLOB對象,而不是sun的Blob
3
4

5
6
try
{
7
Connection conn=<數據庫連接>;
8
File file=<存入數據庫的文件對象>;
9
conn.setAutoCommit(false); // 取消Connection對象的auto commit屬性
10
String file_name=file.getName();
11
12
// 數據庫中有一個item表,其中的file_name (varchar2)存儲文件名,file_blob (blob)存儲文件對象
13
String sql="INSERT INTO item (file_name,file_blob) VALUES ('" + file_name + "',EMPTY_BLOB())"; // 使用“EMPTY_BLOB()“成生一個空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”得到表的寫鎖
18
ResultSet rs=stmt.executeQuery(sql);
19
rs.next();
20
BLOB blob=((OracleResultSet)rs).getBLOB("file_blob"); // 得到BLOB對象
21
OutputStream out=blob.getBinaryOutputStream(); // 建立輸出流
22
InputStream in=new FileInputStream(file); // 建立輸入流
23
int size=blob.getBufferSize();
24
byte[] buffer=new byte[size]; // 建立緩沖區
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

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