您的位置:首页 > 新闻 > 热点要闻 > 旧房翻新装修哪家公司好_技术培训学校机构_seo排名怎么优化软件_有名的seo外包公司

旧房翻新装修哪家公司好_技术培训学校机构_seo排名怎么优化软件_有名的seo外包公司

2025/1/10 0:39:58 来源:https://blog.csdn.net/weixin_43543654/article/details/143033929  浏览:    关键词:旧房翻新装修哪家公司好_技术培训学校机构_seo排名怎么优化软件_有名的seo外包公司
旧房翻新装修哪家公司好_技术培训学校机构_seo排名怎么优化软件_有名的seo外包公司

大体背景:要求将服务器部署的windows系统中的考勤打卡文件拷贝下来,再将其解析插入到数据库中

下载文件的两种方式:jcifs  、 smbj

推荐第二种

第一种推荐文章:

        JAVA远程访问共享目录 - 互联互通社区 - 博客园 (cnblogs.com)
通过SMB协议上传,下载文件.-CSDN博客
jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/IP 解决方案_jcifs.smb.smbexception: failed to connect to serve-CSDN博客


第二种方式

文件下载

可以直接下载,不需要返回下载到本地的地址。【下载位置开发者都知道的】

/*** @param ip        主机号  "192.168.1.102"* @param user      账户  "du_tepai"* @param password  密码 "Pass@56215"* @param shareName 共享文件夹 "FileShare"  * @param fileName  指的是共享文件夹下的文件  文件名为testKaoqin.mdb* @param localPath*/public String downMDBFile(String ip, String user, String password, String shareName, String fileName, String localPath) {// 设置超时时间(可选)SmbConfig config = SmbConfig.builder().withTimeout(120, TimeUnit.SECONDS).withTimeout(120, TimeUnit.SECONDS) // 超时设置读,写和Transact超时(默认为60秒).withSoTimeout(180, TimeUnit.SECONDS) // Socket超时(默认为0秒).build();// 如果不设置超时时间	SMBClient client = new SMBClient();SMBClient client = new SMBClient(config);try {Connection connection = client.connect(ip);AuthenticationContext ac = new AuthenticationContext(user, password.toCharArray(), null);Session session = connection.authenticate(ac);// 连接共享文件夹DiskShare share = (DiskShare) session.connectShare(shareName);String dstPath = System.getProperty("user.dir") + File.separator + localPath + File.separator + fileName;// 创建 Path 对象Path path = Paths.get(dstPath);// 获取上级目录路径Path parentDir = path.getParent();// 创建上级目录try {Files.createDirectories(parentDir);} catch (IOException e) {throw new RuntimeException(e);}log.info("下载的文件地址==={}", dstPath);FileOutputStream fos = new FileOutputStream(dstPath);BufferedOutputStream bos = new BufferedOutputStream(fos);if (share.fileExists(fileName)) {log.info("正在下载文件:==========");com.hierynomus.smbj.share.File smbFileRead = share.openFile(fileName, EnumSet.of(AccessMask.GENERIC_READ), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);InputStream in = smbFileRead.getInputStream();byte[] buffer = new byte[2048];int len = 0;while ((len = in.read(buffer, 0, buffer.length)) != -1) {bos.write(buffer, 0, len);}bos.flush();bos.close();log.info("文件{}下载成功", fileName);log.info("==========================");return dstPath;} else {log.info("文件不存在");}} catch (Exception e) {log.error("downMDBFile发生错误!{}", e);} finally {if (client != null) {client.close();}}return null;}

后缀为.mdb文件解析 

第一种插表方式  记录日志用的  @Slf4j
/*** @param cardNo       赋值前查询的打卡——工号字段* @param checkTime    赋值前查询的打卡时间字段* @param specialTime  赋值前查询的打卡时间字段——补位只是HH:mm:ss 时间* @param accessDbPath mdb文件地址* @param sql          执行语句——查询* @param clickDay     考勤日* @param fileName     mdb文件名*/public void insertData(String cardNo, String checkTime, String specialTime, String accessDbPath, String sql, String clickDay, String fileName) {String mdbUrl = "jdbc:ucanaccess://" + accessDbPath;// 连接到 Access 数据库Connection mysqlConn = null; // 将 mysqlConn 移动到 try 外部以便于关闭try (Connection mdbConn = DriverManager.getConnection(mdbUrl)) {mysqlConn = DriverManager.getConnection(dynamicDataSourceProperties.getDatasource().get("master").getUrl(), dynamicDataSourceProperties.getDatasource().get("master").getUsername(), dynamicDataSourceProperties.getDatasource().get("master").getPassword());//先查询mdb中数据Statement mdbStmt = mdbConn.createStatement();log.info("qw={}", sql);ResultSet rs = mdbStmt.executeQuery(sql);// 处理结果集插入mysql表中String insertQuery = "INSERT INTO test_clock_record(user_no, clock_time,file_name,clock_day) VALUES (?,?,?,?)";// 禁用自动提交mysqlConn.setAutoCommit(false);SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");  // 根据你的时间格式调整SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try (PreparedStatement mysqlstmt = mysqlConn.prepareStatement(insertQuery)) {while (rs.next()) {String USERID = rs.getString(cardNo);String CHECKTIME = rs.getString(checkTime);if (StringUtils.isNotBlank(specialTime)) {Date date = rs.getDate(checkTime);String timeStr = rs.getString(specialTime);Date time = timeFormat.parse(timeStr);//日期合并Date mergeTime = new Date(date.getTime() + time.getTime());CHECKTIME = sdf.format(mergeTime);}//插入第一条打卡记录mysqlstmt.setString(1, USERID);mysqlstmt.setString(2, CHECKTIME);mysqlstmt.setString(3, fileName);mysqlstmt.setString(4, clickDay);mysqlstmt.addBatch(); // 添加到批处理//                    mysqlstmt.executeUpdate();}// 执行批处理mysqlstmt.executeBatch();// 提交事务mysqlConn.commit();log.info("解析打卡记录文件——{}成功!", fileName);} catch (SQLException e) {mysqlConn.rollback(); // 如果出现异常,回滚事务log.info("Error executing batch insert: {}", e.getMessage());} finally {// 恢复自动提交状态mysqlConn.setAutoCommit(true);}} catch (Exception e) {log.error("An exception occurred", e); // 记录异常} finally {if (mysqlConn != null) {try {mysqlConn.close(); // 确保 MySQL 连接被关闭} catch (SQLException e) {log.error("Error closing MySQL connection: {}", e.getMessage());}}}}
 第二种插表方式  

因为打卡文件可能k1.mdb  与 k2.mdb 里面的格式不同。 同时 时间也不同,比如有的带时区,有的带毫秒,有的微妙
情形如下:
2024-09-01T00:07:27.000+0800
2024-09-02 08:47:52.000000
报错:'2024-09-01 00:07:27' could not be parsed at index 10  
我用的字符串接收的,但是因为有的打卡文件中打卡时间分为  1.两个字段:nDate:2024-01-02, nTime:18:20   2.一个字段:clock_date:2024-09-02 08:47:52
可写两个方法,各自处理不同文件,直接用Date 或者LocalDateTime 接收会好一些
此处代码因为时间用 String 字符串接收,故作了处理,将此处代码删除,则会简单许多!!

public void insertDataThroughDate(String cardNo, String checkTime, String specialTime, String accessDbPath, String sql, String clickDay, String fileName) {String mdbUrl = "jdbc:ucanaccess://" + accessDbPath;log.info("连接路径为{}", mdbUrl);// 连接到 Access 数据库try {Connection mdbConn = DriverManager.getConnection(mdbUrl);//先查询mdb中数据Statement mdbStmt = mdbConn.createStatement();log.info("qw={}", sql);ResultSet rs = mdbStmt.executeQuery(sql);// 处理结果集插入mysql表中DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS")).appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnn")).appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd")).toFormatter();List<TestClockinRecord> list = Lists.newArrayList();Set<String> set= Sets.newHashSet();while (rs.next()) {EspClockinRecord ecr = new EspClockinRecord();String USERID = rs.getString(cardNo);String tmpstr = rs.getString(checkTime);String CHECKTIME = (tmpstr.length() > 20 && tmpstr.contains(".")) ? tmpstr.substring(0, 19) : tmpstr;if (StringUtils.isNotBlank(specialTime)) {Date date = rs.getDate(checkTime);Time time = rs.getTime(specialTime);//日期合并Date mergeTime = new Date(date.getTime() + time.getTime());// log.info("时间显示为=={}", mergeTime);Instant instant = mergeTime.toInstant();// 定义 ISO 8601 格式的 DateTimeFormatterDateTimeFormatter f2 = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.of("UTC"));// 格式化为 ISO 8601 字符串CHECKTIME = f2.format(instant);//log.info("格式化为{}", CHECKTIME);CHECKTIME = DateUtils.convertIsoToLocalYMDhms(CHECKTIME, null);//log.info("加8小时候为{}",CHECKTIME);}//插入第一条打卡记录ecr.setIdNo(USERID);try {ecr.setClockTime(LocalDateTime.parse(CHECKTIME, formatter));ecr.setClockDay(LocalDateTime.parse(CHECKTIME, formatter).toLocalDate().toString());} catch (Exception e) {set.add(CHECKTIME+"工号:"+USERID+" 来自:"+fileName+"\n");continue;}ecr.setFileName(fileName);list.add(ecr);}clockinRecordService.saveBatch(list, 500);log.info("解析打卡记录文件——{}成功!", fileName);if(set.size()>0){sendErrorEmail("考勤打卡解析插入表中部门数据错误!", "错误信息来源为:"+set);}} catch (Exception e) {log.error("!!!!!!!!=====同步考勤打卡记录错误{}", e.getMessage(), e);sendErrorEmail("考勤打卡解析插入表中错误!", "错误信息为:"+e.getMessage());}}



其余文章推荐:

SpringBoot访问windows共享文件的方法_java_脚本之家 (jb51.net)
通过smb协议上传下载文件到nas_java上传文件到nas指定目录-CSDN博客

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com