使用SpringBoot读取Windows共享文件的代码示例

 更新时间:2024年11月04日 10:44:00   作者:Jerryean99  
在现代企业环境中,文件共享是一个常见的需求,Windows共享文件夹(SMB/CIFS协议)因其易用性和广泛的兼容性,成为了许多企业的首选,在Java应用中,尤其是使用Spring Boot框架时,如何读取Windows共享文件是一个值得探讨的话题,本文介绍了使用SpringBoot读取Windows共享文件

一、背景

在现代企业环境中,文件共享是一个常见的需求。Windows共享文件夹(SMB/CIFS协议)因其易用性和广泛的兼容性,成为了许多企业的首选。在Java应用中,尤其是使用Spring Boot框架时,如何读取Windows共享文件是一个值得探讨的话题。本文将介绍如何在Spring Boot应用中实现这一功能。

二、需求概述

项目需要对接各种的设备仪器,有很多的类型,例如串口传输、读取数据库、TCP/IP等等方式,这些解决办法是非常多的,但是有几台机器是做完实验就会在本地生成文件,一开始我们的想法也比较多,比如业务人员每天进行导入操作,后续考虑到尽量减小业务人员的操作,想到一个简单的方式就是定时读取每个机器电脑上的共享文件,根据它的修改时间读取所需的数据文件。

三、准备工作:windows共享文件夹配置

在windows系统中已经创建并共享了一个文件夹,记录下共享文件夹的网络路径,例如:\\服务器名\共享文件夹名。

确保你的Spring Boot应用所在的系统有权访问该共享文件夹。

配置的流程可以在网上检索一下,网上的示例也特别特别多,说明一下:可以单独建立一个共享的用户
例如用户名:share 密码 123456

四、代码示例

4.1 定时读取共享文件任务Task

@Component
@Slf4j
public class ReadShareFilesTask {

    @Resource
    InspectEquipmentInfoService inspectEquipmentInfoService;

    /**
     * 现在暂定每天执行
     */
    @Scheduled(cron = "0 0 12 * * ?")
    public void executeReadShareFiles() {
        LocalDateTime dateTime = LocalDateTime.now().minusDays(1);
        List<InspectEquipmentInfo> equipmentInfos = inspectEquipmentInfoService.lambdaQuery().eq(InspectEquipmentInfo::getEquipmentType, EquipmentTypeEnum.FILE_SHARING.getCode()).list();
        equipmentInfos.forEach(equipmentInfo -> {
            try {
                log.info("开始读取设备:{}, 设备名称:{}, 设备ip:{}", equipmentInfo.getEquipmentCode(), equipmentInfo.getEquipmentName(), equipmentInfo.getEquipmentAddr());
                FileReadStrategy fileReadStrategy = ClassExecuteServiceFactory.getFileReadStrategy(equipmentInfo.getEquipmentCode());
                ValidationUtils.checkNotNull(fileReadStrategy, "策略未找到");
                fileReadStrategy.listFile(equipmentInfo.getEquipmentAddr(),dateTime);
            } catch (Exception e) {
                log.error("读取设备:{}, 设备名称:{}, 设备ip:{} 失败", equipmentInfo.getEquipmentCode(), equipmentInfo.getEquipmentName(), equipmentInfo.getEquipmentAddr(), e);
            }
        });
    }
}

4.2 工厂类

@Component
public class ClassExecuteServiceFactory implements ApplicationContextAware {

    private final static Map<String, FileReadStrategy> CLASS_CODE_ABSTRACT_CLASS_HANDLE_MAP = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, FileReadStrategy> types = applicationContext.getBeansOfType(FileReadStrategy.class);
        types.values().forEach(e -> CLASS_CODE_ABSTRACT_CLASS_HANDLE_MAP.putIfAbsent(e.getCode(), e));
    }

    public static FileReadStrategy getFileReadStrategy(String code) {
        return CLASS_CODE_ABSTRACT_CLASS_HANDLE_MAP.get(code);
    }
}

4.3 文件读取接口策略

public interface FileReadStrategy {

    String getCode();

    void listFile(String ip, LocalDateTime dateTime);

    void handleFileRead(InputStream inputStream, InspectEquipmentInfo info);
}

4.4 策略实现类

@Component
@Slf4j
public class SpectrometerFileReadStrategy implements FileReadStrategy {

    @Resource
    private InspectEquipmentInfoService equipmentInfoService;

    @Resource
    private InspectEquipmentRecordService recordService;

    @Resource
    private ReceiveEquipmentApi receiveEquipmentApi;

    @Override
    public String getCode() {
        return ShareFilesAddressEnum.CODE.getCode();
    }

    @Override
    public void listFile(String ip, LocalDateTime dateTime) {
        InspectEquipmentInfo equipmentInfo = equipmentInfoService.lambdaQuery().eq(InspectEquipmentInfo::getEquipmentAddr, ip).one();
        if (ObjectUtil.isEmpty(equipmentInfo)) {
            log.error("该设备未配置到设备表当中,设备地址 {}", ip);
            return;
        }
        SmbFileReader.listSmbFile(equipmentInfo, dateTime);
    }

    @Override
    public void handleFileRead(InputStream inputStream, InspectEquipmentInfo info) {
        try {
            if (inputStream == null) {
                log.error("无法找到ICP光谱仪CSV文件");
                return;
            }
            //根据文件流解析数据
      }

4.5 读取共享文件流通用类

@Slf4j
public class SmbFileReader {

    public static void listSmbFile(InspectEquipmentInfo info, LocalDateTime dateTime) {
        String path = info.getPath();
        String ip = info.getEquipmentAddr();
        String user = info.getUser();
        String pass = info.getPass();
        String suffix = info.getSuffix();
        String code = info.getEquipmentCode();
        SMBClient client = new SMBClient();
        try (Connection connection = client.connect(ip)) {
            AuthenticationContext ac = new AuthenticationContext(user, pass.toCharArray(), null);
            Session session = connection.authenticate(ac);
            try (DiskShare share = (DiskShare) session.connectShare(path)) {
                for (FileIdBothDirectoryInformation f : share.list("", suffix)) {
                    FileTime changeTime = f.getLastWriteTime();
                    long windowsTimestamp = changeTime.toEpochMillis();
                    Instant instant = Instant.ofEpochMilli(windowsTimestamp);
                    LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
                    if (dateTime.isAfter(localDateTime)) {
                        log.info("File : {},Change Time : {}, 跳过", f.getFileName(), localDateTime);
                        continue;
                    }
                    log.info("File : {},Change Time : {}", f.getFileName(), localDateTime);
                    String fileUrl = f.getFileName();
                    File smbFileRead = share.openFile(fileUrl, EnumSet.of(AccessMask.GENERIC_READ), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null);
                    InputStream in = smbFileRead.getInputStream();
                    ClassExecuteServiceFactory.getFileReadStrategy(code).handleFileRead(in, info);
                    log.info("File : {} read success", fileUrl);
                }
            }
        } catch (Exception e) {
            log.error("Error reading file from SMB: {}", e.getMessage(), e);
        }

    }

}

五、总结

通过本文,我们了解了如何在Spring Boot应用中读取Windows共享文件。我们使用了jcifs库来处理SMB协议,并通过配置类、服务类和控制器类实现了文件的读取功能,希望这篇文章对你有所帮助。

以上就是使用SpringBoot读取Windows共享文件的代码示例的详细内容,更多关于SpringBoot读取Windows共享文件的资料请关注脚本之家其它相关文章!

相关文章

  • spring 如何解决循环依赖

    spring 如何解决循环依赖

    这篇文章主要介绍了spring 如何解决循环依赖,帮助大家更好的理解和学习使用spring框架,感兴趣的朋友可以了解下
    2021-02-02
  • Java 中 hashCode() 与 equals() 的关系(面试)

    Java 中 hashCode() 与 equals() 的关系(面试)

    这篇文章主要介绍了Java中hashCode()与equals()的关系,ava中hashCode()和equals()的关系是面试中的常考点,文章对hashCode与equals的关系做出详解,需要的小伙伴可以参考一下
    2022-09-09
  • @Transactional跟@DS动态数据源注解冲突的解决

    @Transactional跟@DS动态数据源注解冲突的解决

    这篇文章主要介绍了@Transactional跟@DS动态数据源注解冲突的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot实现极验校验的项目实践

    springboot实现极验校验的项目实践

    在系统业务中,需要想客户发送手机验证码,进行验证后,才能提交,本文主要介绍了springboot实现极验校验的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 详解JAVA设计模式之代理模式

    详解JAVA设计模式之代理模式

    这篇文章主要介绍了JAVA设计模式之代理模式的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java如何使用自己的maven本地仓库详解

    java如何使用自己的maven本地仓库详解

    这篇文章主要给大家介绍了关于java如何使用自己的maven本地仓库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Hystrix Turbine聚合监控的实现详解

    Hystrix Turbine聚合监控的实现详解

    微服务架构下,⼀个微服务往往部署多个实例,如果每次只能查看单个实例的监控,就需要经常切换很不⽅便,在这样的场景下,我们可以使⽤ Hystrix Turbine 进⾏聚合监控,它可以把相关微服务的监控数据聚合在⼀起,便于查看
    2022-09-09
  • Mybatis步骤分解实现一个增删改查程序

    Mybatis步骤分解实现一个增删改查程序

    MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动。本文将整合MybatisPlus实现增删改查功能,感兴趣的可以了解一下
    2022-05-05
  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    这篇文章主要介绍了MyBatis 中 ${}和 #{}的正确使用方法,本文给大家提到了MyBatis 中 ${}和 #{}的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Spring Cloud应用实现配置自动刷新过程详解

    Spring Cloud应用实现配置自动刷新过程详解

    这篇文章主要介绍了Spring Cloud应用实现配置自动刷新过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论