java 文件上传至oracle blob字段 实现

指定文件夹下的所有文件上传至oracle的blob字段,java实现


package com.huth;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.OutputStream;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Blob;

import java.util.ArrayList;

/**
 * 
 * 采用简单递归方法读取指定目录下的所有固定后缀的文件(文件夹下可能嵌套子文件夹)
 *
 */
public class ReadFiles {
	private ArrayList<File> files; //目录下的所有文件列表
	private static String prefix = "doc"; //文件后缀
	
	public ReadFiles(ArrayList<File> files){
		this.files = files;
	}
	
	public void readFilesInDir(String dir)throws FileNotFoundException,IOException{
		try{
			File folder = new File(dir);
			
			//若dir是文件,直接获取文件名
			if(!folder.isDirectory()){
				//System.out.println(folder+"是文件");
				String fileName = dir +"\\"+folder.getName();
				//System.out.println("fileName="+fileName);
				System.out.println("prefix="+fileName.substring(fileName.lastIndexOf(".")+1).trim());
				if(fileName.substring(fileName.lastIndexOf(".")+1).trim().equalsIgnoreCase(prefix)){
					files.add(new File(fileName));
				}
			}
			
			//若dir是文件夹,则获取文件夹内的文件列表
			//若其中还有文件夹,则递归
			else if(folder.isDirectory()){
				//System.out.println(folder+"是文件夹");
				String[] fileLists = folder.list();//文件夹下的文件名和子文件夹名
				for(int i=0;i<fileLists.length;i++){
					//System.out.println("fileLists["+i+"]="+fileLists[i]);
					
					File file = new File(dir+"\\"+fileLists[i]);
					if(!file.isDirectory()){
						 //System.out.println(file+"是文件");
						 String fileName = dir +"\\"+file.getName();
						 //System.out.println("fileName="+fileName);
						 System.out.println("prefix="+fileName.substring(fileName.lastIndexOf(".")+1).trim());
						 if(fileName.substring(fileName.lastIndexOf(".")+1).trim().equalsIgnoreCase(prefix)){
							 files.add(new File(fileName));
						 }					
					}
					else if(file.isDirectory()){
						readFilesInDir(dir+"\\"+fileLists[i]);
					}
				}
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException ex){
			ex.printStackTrace();
		}

	}
	
	private Connection newConnection(String user, String password){
		Connection con = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
			con = DriverManager.getConnection("jdbc:oracle:thin:@172.16.10.249:1521:test",user,password);
		}catch(SQLException e){
			e.printStackTrace();
			return null;
		}catch(ClassNotFoundException exc){
			exc.printStackTrace();
			return null;
		}catch(IllegalAccessException ex){
			ex.printStackTrace();
			return null;
		}catch(InstantiationException exception){
			exception.printStackTrace();
			return null;
		}
		return con;
	}
	
	//unit test
	public static void main(String[] args){
		ArrayList<File> files = new ArrayList<File>();
		ReadFiles read = new ReadFiles(files);
		
		Connection conn = read.newConnection("test", "oracle");
		ResultSet rs;
		
		try{
			read.readFilesInDir("d:/test");
			System.out.println("files.size()="+files.size());
						
			for(int i=0;i<files.size();i++){
				String fileName = files.get(i).getName();
				System.out.println("fileNames["+i+"]="+fileName);
				
				FileInputStream fin = new FileInputStream(files.get(i));
				PreparedStatement stmt = conn.prepareStatement("insert into aa values("+fileName+",empty_blob())");
				rs = stmt.executeQuery("select text from aa where name = "+fileName+" for update");
				if(rs.next()){
					Blob blob = rs.getBlob(1);
					OutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream();
					byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize()];
					int len = 0;
					while((len = fin.read(b))!=-1)
					out.write(b,0,len);
					fin.close();
					out.close();
					rs.close();
					conn.commit();
				}
			}
			
			conn.close();
			
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException ex){
			ex.printStackTrace();
		}catch(SQLException exc){
			exc.printStackTrace();
		}
	}

}

转载于:https://my.oschina.net/rouchongzi/blog/113987

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值