使用原生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; } }
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
类似如此的循环遍历功能,需要文件夹及文件的命名规则要一直,要保持一定的统一标准。