使用原生JDBC循环读取文件并持久化到数据库

先上代码:

package com.demo.common.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;





public class ReadFileService {
    
    private static Integer counts = 0;
    
    private static Connection conn = null;
    private static PreparedStatement pre = null;
    
    //基础信息
    public static void getBase(String strPath) { 
        File dir = new File(strPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        List<String> filelist = new ArrayList<String>();
        if (files != null ) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                String filetype = "";
                String filePath = "";
                String xmmc = "";
                if (files[i].isDirectory()) { // 判断是否文件夹,如果是文件夹则一直遍历
                    getBase(files[i].getAbsolutePath());
                } else { // 判断文件后缀
                    filelist.add(fileName);
                    filePath = files[i].getAbsolutePath().substring(0, files[i].getAbsolutePath().lastIndexOf("\\")+1);
                    if(!"".equals(filePath))filelist.add(filePath);
                    xmmc = fileName.substring(fileName.indexOf("年")-4, fileName.indexOf("."));
                    if(!"".equals(xmmc))filelist.add(xmmc);
                        if(fileName.endsWith("pdf")){
                            filetype = "12";
                        }else{
                            filetype = "11";
                        }
                    filelist.add(filetype);
                    String sql = "insert into g_files_db values (sys_guid(), ?, ?, ?, ?, to_char(sysdate,'yyyy-MM-dd'))";
                    try {
                        //int result = DataBaseHelper.update(sql, new Object[]{fileName,filePath,xmmc,filetype});
                        pre = conn.prepareStatement(sql);
                        pre.setString(1, fileName);
                        pre.setString(2, filePath);
                        pre.setString(3, xmmc);
                        pre.setString(4, filetype);
                        int result = pre.executeUpdate();
                        counts = counts + result;
                    } catch (Exception e) {
                        e.printStackTrace();
                        counts = -1;
                        return;
                    }
                    
                } 
            }
            
        }
    }
    
    //坐标信息
    public static void getCoordinate(String strPath) { 
        File dir = new File(strPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        List<String> filelist = new ArrayList<String>();
        if (files != null ) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                String filetype = "";
                String filePath = "";
                String xmmc = "";
                if (files[i].isDirectory()) { // 判断是否文件夹,如果是文件夹则一直遍历
                    getCoordinate(files[i].getAbsolutePath());
                } else { // 判断文件后缀
                    filelist.add(fileName);
                    filePath = files[i].getAbsolutePath().substring(0, files[i].getAbsolutePath().lastIndexOf("\\")+1);
                    if(!"".equals(filePath))filelist.add(filePath);
                        xmmc = fileName.substring(fileName.indexOf("年")-4, fileName.indexOf("."));
                    if(!"".equals(xmmc))filelist.add(xmmc);
                    if(fileName.endsWith("prj")){
                        filetype = "32";
                    }else if(fileName.endsWith("dbf")){
                        filetype = "33";
                    }else if(fileName.endsWith("sbn")){
                        filetype = "34";
                    }else if(fileName.endsWith("sbx")){
                        filetype = "35";
                    }else if(fileName.endsWith("shp")){
                        filetype = "31";
                    }else if(fileName.endsWith("shp.xml")){
                        filetype = "36";
                    }else if(fileName.endsWith("shx")){
                        filetype = "37";
                    }else{
                        filetype = "40";
                    }
                    filelist.add(filetype);
                    String sql = "insert into g_files_db values (sys_guid(), ?, ?, ?, ?, to_char(sysdate,'yyyy-MM-dd'))";
                    try {
                        //int result = DataBaseHelper.update(sql, new Object[]{fileName,filePath,xmmc,filetype});
                        pre = conn.prepareStatement(sql);
                        pre.setString(1, fileName);
                        pre.setString(2, filePath);
                        pre.setString(3, xmmc);
                        pre.setString(4, filetype);
                        int result = pre.executeUpdate();
                        counts = counts + result;
                    } catch (Exception e) {
                        e.printStackTrace();
                        counts = -2;
                        return;
                    }
                    
                } 
            }
            
        }
    }
    
    //1,首先需要找到目录为“项目清单”的文件夹
    public static void getDirectory(String strPath) {
        File dir = new File(strPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        //String fileDirectory = "";
        if (files != null ) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                if (files[i].isDirectory()) { // 判断是否是对应的目录
                    if(fileName.contains("项目清单")){
                        getType(files[i].getAbsolutePath());   //调用方法,查找是否包含“项目调查表”、“坐标”文件夹。
                    }
                    else getDirectory(files[i].getAbsolutePath());
                }else{
                    continue;
                } 
            }
            
        }
    }
    
    //2.找到基础信息目录和坐标目录,文件夹需要创建合理
    public static void getType(String strPath) {
        File dir = new File(strPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        if (files != null ) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                if (files[i].isDirectory()) { // 判断是文件还是文件夹
                    if(fileName.contains("项目调查表")){
                        getBase(files[i].getAbsolutePath());
                    }else if(fileName.contains("坐标")){
                        getCoordinate(files[i].getAbsolutePath());
                    }else getType(files[i].getAbsolutePath());
                }else{
                    continue;
                }
            }
        }
    }
    
    //将所有shp格式的文件写入到文件中
    public static void writeSHP(String path){
        File file = new File(path);
        String sql = "select filepath || regexp_substr(filename, '[^.]+', 1, 1) filename from G_FILES_DB where type = '31'";
        try {
            if(!file.exists()){
                file.createNewFile();
            }
            FileOutputStream outStream = new FileOutputStream(file,true);
            pre = conn.prepareStatement(sql);
            ResultSet re = pre.executeQuery();
            while(re.next()){
                outStream.write(re.getString(1).getBytes("utf-8"));
                outStream.write("\r\n".getBytes("utf-8"));
            }
            outStream.close();
            //counts = 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        counts = 0;
    }
    
    //方法入口
    public static void main(String[] args) {
        Properties prop = read();
        String path = prop.getProperty("file.path");
        String savePath = prop.getProperty("file.savePath");
        String url = prop.getProperty("file.url");
        String user = prop.getProperty("file.user");
        String psd = prop.getProperty("file.password");
        conn = getConn(url, user, psd);
        getDirectory(path);
        if(counts < 0){
            System.out.println("数据已存在,再次插入失败!");
        }else{
            System.out.println("更新了"+counts+"条数据");
            writeSHP(savePath);
            closeConn();
        }
    }
    
     //获取连接
        public static Connection getConn(String url,String user,String psd){
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                conn = DriverManager.getConnection(url,user,psd);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            return conn;
        }
    
        //关闭所有连接
        public static void closeConn (){
            try {
                if(pre != null){
                    pre.close();
                    pre = null;
                }
                if(conn != null){
                    conn.close();
                    conn = null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        //获取配置文件访问对象
        public static Properties read() {
            Properties pro = new Properties(); 
            File file = new File("C:\\EIfilePath\\application.properties");
            try {
                FileInputStream in = new FileInputStream(file);
                pro.load(in);
            } catch (Exception e) {
                System.out.println(e);
            }
            return pro;
        }
}
View Code

1,类中的方法主要是根据需要遍历的目的文件夹进行遍历,根据类型的不同,存入到数据库中,同时也包括了JDBC对象的创建、使用、关闭。同时将部分数据写入到txt文件中。

2,除了Java文件外,还需要创建一个配置文件,配置文件中配置了遍历目的文件夹,数据库信息,写入字符串到哪个文件。

在eclipse等IDE中直接运行主函数即可。

3,如果使用cmd窗口直接运行class文件,则需要注意以下几点:

  1),在cmd中输入:javac -encoding utf-8 ReadFileService.java                  //ReadFileService是类名;-encoding utf-8设置编码格式,如果不设置,且类中有中文,则会报错。

  2),编译完成后,再执行命令:java ReadFileService                                //执行命令前,要确保Java文件同目录下有对应的配置文件,且在配置文件中,所需配置都配置无误。

4,说下环境变量配置问题,由于使用cmd运行class文件,且类中涉及与数据库交互问题,则需要在classpath中配置驱动jar包路径,这里以Oracle为例吧。

.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;C:\ojdbc6.jar            // .; 注意不要忘记

.class文件,.properties配置文件一定在同一目录下,因为程序中使用的是通过获取.class文件的路径然后获取.properties文件的。

5,application.properties中的属性配置

 

file.path=C:\\EIfilePath
file.url=jdbc:oracle:thin:@172.16.1.23:1521:orcl
file.user=nfb_Devs_v5
file.password=1qazxsw2
file.savePath = C:\\EIfilePath\\SHP.txt

类似如此的循环遍历功能,需要文件夹及文件的命名规则要一直,要保持一定的统一标准。

posted on 2019-04-24 16:27  MrQuan  阅读(632)  评论(0编辑  收藏  举报