import java.sql.*;
import java.io.*;
import oracle.sql.*;
import oracle.jdbc.*;
/**
* @author Sean
* @version 1.0
* @date 2005/8/24
*/
public class LobExample2 {
public static void readCLOB(Statement stmt,String fileName,
String sourceDirectory,String targetDirectory)
throws SQLException,IOException {
//step 1 : 将包含LOB定位器的行读入结果集
ResultSet rs = stmt.executeQuery("select clob_column from clob_content ");
//step 2 : 在JAVA程序中创建一个LOB对象,并且将LOB定位器从结果集读入这个LOB对象。
rs.next();
oracle.sql.CLOB myClob = ((OracleResultSet)rs).getCLOB(1);
//ste[ 3 : 从LOB对象获取LOB的组块大小
int chunkSize = myClob.getChunkSize();
//step 4 : 创建一个缓冲区来存储自LOB对象的数据组块
char[] charBuffer = new char[chunkSize];
//step 5 : 创建一个文件对象
String saveFile = targetDirectory +"retrievedCLOB"+ fileName;
File myFile = new File(saveFile);
//step 6 : 创建输出流对象以便将LOB内容写到新文件
OutputStreamWriter myOutputStreamWriter = new OutputStreamWriter (
new FileOutputStream (myFile));
BufferedWriter myBufferedWriter = new BufferedWriter(myOutputStreamWriter);
//step 7 : 从LOB对象获取LOB内容的长度
long clobLength = myClob.length();
//step 8 : 将数据组块从LOB对象读入到第四步中创建的缓冲区。将缓冲区的内容写到新文件
for(long position = 1 ; position<=clobLength;position += chunkSize) {
int charRead = myClob.getChars(position,chunkSize,charBuffer);
myBufferedWriter.write(charBuffer);
} // end of for
//step 9 : 关闭流对象
myBufferedWriter.close();
myOutputStreamWriter.close();
System.out.println("Read CLOB and saved file " + saveFile);
} // end of readCLOB
public static void readBLOB(Statement stmt,String fileName,
String sourceDirectory,String targetDirectory)
throws SQLException,IOException {
ResultSet rs = stmt.executeQuery("select blob_column from blob_content ");
rs.next();
oracle.sql.BLOB myBlob = ((OracleResultSet)rs).getBLOB(1);
int chunkSize = myBlob.getChunkSize();
long blobLength = myBlob.length();
byte[] bytesBuffer = new byte[chunkSize];
String saveFile = targetDirectory + "readBLOB"+fileName;
FileOutputStream myFileOutputStream = new FileOutputStream (
new File(saveFile));
for (long position = 1 ; position <= blobLength ; position += chunkSize) {
int byteRead = myBlob.getBytes(position,chunkSize,bytesBuffer);
myFileOutputStream.write(bytesBuffer);
} // end of for
myFileOutputStream.close();
System.out.println("Read BLOB and saved file "+saveFile);
} // end of readBLOB
public static void retrievedBFILE(Statement stmt,String fileName,
String targetDirectory)
throws SQLException,IOException {
ResultSet rs = stmt.executeQuery("select bfile_column from bfile_content ");
rs.next();
oracle.sql.BFILE myBfile = ((OracleResultSet)rs).getBFILE(1);
String bfileName = myBfile.getName();
myBfile.fileExists();
myBfile.openFile();
InputStream myInputStream = myBfile.getBinaryStream();
String saveFile = targetDirectory + "retrievedBFILE"+bfileName;
saveFile(myInputStream,saveFile);
myInputStream.close();
myBfile.closeFile();
System.out.println("Read BFILE and save file "+saveFile);
} // end of retrievedBFILE
public static void saveFile(InputStream myInputStream,String fileName) throws IOException {
FileOutputStream myFileOutputStream = new FileOutputStream (
new File (fileName));
byte[] byteBuffer = new byte[8132];
int byteRead;
while((byteRead = myInputStream.read(byteBuffer)) != -1 ) {
myFileOutputStream.write(byteBuffer);
} //end of while
myFileOutputStream.close();
} // end of saveFile
public static void main(String[] args) throws SQLException,IOException {
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:swatt/swgood@10.10.10.251:1521:test");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
String sourceDirectory = "D:\\JSPBook\\JDBC\\JDBC_book\\sample_files\\";
String targetDirectory = "D:\\JSPBook\\JDBC\\JDBC_book\\sample_files\\retrieved\\";
readCLOB(stmt,"textContent.txt",sourceDirectory,targetDirectory);
readBLOB(stmt,"binaryContent.doc",sourceDirectory,targetDirectory);
retrievedBFILE(stmt,"textContent.txt",targetDirectory);
stmt.close();
conn.close();
} // end of main
}//end of LobExample2