最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SpringBoot讀取Windows共享文件的代碼示例

 更新時間:2024年11月04日 10:44:00   作者:Jerryean99  
在現(xiàn)代企業(yè)環(huán)境中,文件共享是一個常見的需求,Windows共享文件夾(SMB/CIFS協(xié)議)因其易用性和廣泛的兼容性,成為了許多企業(yè)的首選,在Java應(yīng)用中,尤其是使用Spring Boot框架時,如何讀取Windows共享文件是一個值得探討的話題,本文介紹了使用SpringBoot讀取Windows共享文件

一、背景

在現(xiàn)代企業(yè)環(huán)境中,文件共享是一個常見的需求。Windows共享文件夾(SMB/CIFS協(xié)議)因其易用性和廣泛的兼容性,成為了許多企業(yè)的首選。在Java應(yīng)用中,尤其是使用Spring Boot框架時,如何讀取Windows共享文件是一個值得探討的話題。本文將介紹如何在Spring Boot應(yīng)用中實現(xiàn)這一功能。

二、需求概述

項目需要對接各種的設(shè)備儀器,有很多的類型,例如串口傳輸、讀取數(shù)據(jù)庫、TCP/IP等等方式,這些解決辦法是非常多的,但是有幾臺機器是做完實驗就會在本地生成文件,一開始我們的想法也比較多,比如業(yè)務(wù)人員每天進(jìn)行導(dǎo)入操作,后續(xù)考慮到盡量減小業(yè)務(wù)人員的操作,想到一個簡單的方式就是定時讀取每個機器電腦上的共享文件,根據(jù)它的修改時間讀取所需的數(shù)據(jù)文件。

三、準(zhǔn)備工作:windows共享文件夾配置

在windows系統(tǒng)中已經(jīng)創(chuàng)建并共享了一個文件夾,記錄下共享文件夾的網(wǎng)絡(luò)路徑,例如:\\服務(wù)器名\共享文件夾名。

確保你的Spring Boot應(yīng)用所在的系統(tǒng)有權(quán)訪問該共享文件夾。

配置的流程可以在網(wǎng)上檢索一下,網(wǎng)上的示例也特別特別多,說明一下:可以單獨建立一個共享的用戶
例如用戶名:share 密碼 123456

四、代碼示例

4.1 定時讀取共享文件任務(wù)Task

@Component
@Slf4j
public class ReadShareFilesTask {

    @Resource
    InspectEquipmentInfoService inspectEquipmentInfoService;

    /**
     * 現(xiàn)在暫定每天執(zhí)行
     */
    @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("開始讀取設(shè)備:{}, 設(shè)備名稱:{}, 設(shè)備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("讀取設(shè)備:{}, 設(shè)備名稱:{}, 設(shè)備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 策略實現(xiàn)類

@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("該設(shè)備未配置到設(shè)備表當(dāng)中,設(shè)備地址 {}", ip);
            return;
        }
        SmbFileReader.listSmbFile(equipmentInfo, dateTime);
    }

    @Override
    public void handleFileRead(InputStream inputStream, InspectEquipmentInfo info) {
        try {
            if (inputStream == null) {
                log.error("無法找到ICP光譜儀CSV文件");
                return;
            }
            //根據(jù)文件流解析數(shù)據(jù)
      }

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);
        }

    }

}

五、總結(jié)

通過本文,我們了解了如何在Spring Boot應(yīng)用中讀取Windows共享文件。我們使用了jcifs庫來處理SMB協(xié)議,并通過配置類、服務(wù)類和控制器類實現(xiàn)了文件的讀取功能,希望這篇文章對你有所幫助。

以上就是使用SpringBoot讀取Windows共享文件的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot讀取Windows共享文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文讀懂Java Iterator(迭代器)

    一文讀懂Java Iterator(迭代器)

    這篇文章主要介紹了Java Iterator(迭代器)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 使用WebUploader實現(xiàn)上傳文件功能(一)

    使用WebUploader實現(xiàn)上傳文件功能(一)

    這篇文章主要為大家詳細(xì)介紹了使用WebUploader實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑

    springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑

    這篇文章主要介紹了springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader可以加載jar包下META-INF下的spring.factories,把相關(guān)接口的實現(xiàn)按照key,value的形式加載到內(nèi)存,一個接口的多個實現(xiàn)可以按照","進(jìn)行分割
    2022-10-10
  • java 將數(shù)據(jù)加載到內(nèi)存中的操作

    java 將數(shù)據(jù)加載到內(nèi)存中的操作

    這篇文章主要介紹了java 將數(shù)據(jù)加載到內(nèi)存中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring Security使用多種加密方式進(jìn)行密碼校驗的代碼示例

    Spring Security使用多種加密方式進(jìn)行密碼校驗的代碼示例

    在Web應(yīng)用中,密碼的安全存儲和驗證是至關(guān)重要的,本文將通過一個具體的代碼示例,介紹和總結(jié)如何在Spring Security中使用多種加密方式進(jìn)行密碼校驗,文中通過代碼講解得非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java并發(fā) CompletableFuture異步編程的實現(xiàn)

    Java并發(fā) CompletableFuture異步編程的實現(xiàn)

    這篇文章主要介紹了Java并發(fā) CompletableFuture異步編程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Spring MultipartFile實現(xiàn)多文件上傳攻略

    Spring MultipartFile實現(xiàn)多文件上傳攻略

    這篇文章主要介紹了Spring MultipartFile實現(xiàn)多文件上傳,MultipartFile是Spring框架中用于處理文件上傳的核心接口,MultipartFile的使用需注意文件驗證和錯誤處理,以保證系統(tǒng)的穩(wěn)定性和安全性,需要的朋友可以參考下
    2025-10-10
  • Maven添加Tomcat插件實現(xiàn)熱部署代碼實例

    Maven添加Tomcat插件實現(xiàn)熱部署代碼實例

    這篇文章主要介紹了Maven添加Tomcat插件實現(xiàn)熱部署代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04

最新評論

蒙山县| 伊川县| 麻栗坡县| 莱西市| 平乐县| 哈密市| 本溪市| 芜湖市| 涪陵区| 伊金霍洛旗| 武汉市| 文成县| 鄂托克旗| 石河子市| 金昌市| 筠连县| 高密市| 邵阳县| 宿松县| 哈巴河县| 五大连池市| 济源市| 闸北区| 灵台县| 银川市| 柞水县| 卫辉市| 鹤壁市| 福海县| 龙游县| 桑日县| 隆昌县| 蓝山县| 乳源| 远安县| 探索| 铅山县| 运城市| 微山县| 盘山县| 芒康县|