使用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ù)人員每天進行導(dǎo)入操作,后續(xù)考慮到盡量減小業(yè)務(wù)人員的操作,想到一個簡單的方式就是定時讀取每個機器電腦上的共享文件,根據(jù)它的修改時間讀取所需的數(shù)據(jù)文件。
三、準備工作: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è)備表當中,設(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共享文件的代碼示例的詳細內(nèi)容,更多關(guān)于SpringBoot讀取Windows共享文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java?中?hashCode()?與?equals()?的關(guān)系(面試)
這篇文章主要介紹了Java中hashCode()與equals()的關(guān)系,ava中hashCode()和equals()的關(guān)系是面試中的常考點,文章對hashCode與equals的關(guān)系做出詳解,需要的小伙伴可以參考一下2022-09-09@Transactional跟@DS動態(tài)數(shù)據(jù)源注解沖突的解決
這篇文章主要介紹了@Transactional跟@DS動態(tài)數(shù)據(jù)源注解沖突的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解
微服務(wù)架構(gòu)下,?個微服務(wù)往往部署多個實例,如果每次只能查看單個實例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場景下,我們可以使??Hystrix?Turbine?進?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控數(shù)據(jù)聚合在?起,便于查看2022-09-09MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Spring Cloud應(yīng)用實現(xiàn)配置自動刷新過程詳解
這篇文章主要介紹了Spring Cloud應(yīng)用實現(xiàn)配置自動刷新過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12