第一步添加 Maven 依赖首先需要在你的项目中引入 jcifs 的依赖。如果你使用 Maven在pom.xml中添加dependency groupIdorg.codelibs/groupId artifactIdjcifs/artifactId version3.0.2/version /dependencyJava 代码package com.cim.ext.components; import com.cim.ext.dto.FileInfo; import lombok.extern.slf4j.Slf4j; import org.codelibs.jcifs.smb.CIFSContext; import org.codelibs.jcifs.smb.context.SingletonContext; import org.codelibs.jcifs.smb.impl.NtlmPasswordAuthenticator; import org.codelibs.jcifs.smb.impl.SmbFile; import org.codelibs.jcifs.smb.impl.SmbFileInputStream; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; /** * 使用jcifs读取SMB共享文件的工具类 */ Component Slf4j public class SmbFileReader { Value(${smb.user}) private String smbUser; Value(${smb.password}) private String smbPassword; /** * * 把 Windows共享文件的 格式的路径 转成 SMB格式 * param path path * return result */ private String toSmbPath(String path) { // 去空格 if (path ! null) { path path.trim(); } // 空路径 if (path null || path.isEmpty()) { return path; } String smbPath path; // 不是\\开头的路径不做转化 if (!smbPath.startsWith(\\\\)) { // 如果是 smb:// 开头说明本身就是smb路径直接返回 return smbPath; } // 把Windows文件路径的格式转成 smb协议的路径 smbPath smb:// smbPath.substring(2); // 将所有反斜杠替换为正斜杠 smbPath smbPath.replace(\\, /); return smbPath; } public SmbFile readSmbFile(String path) throws MalformedURLException{ // 创建认证器 NtlmPasswordAuthenticator auth new NtlmPasswordAuthenticator( null, // 域名这里不需要填 smbUser, smbPassword ); // 创建CIFS上下文 CIFSContext context SingletonContext.getInstance().withCredentials(auth); // 初始化SMB文件对象 return new SmbFile(toSmbPath(path), context); } public ListFileInfo list(String path) { ListFileInfo fileInfos new ArrayList(); SmbFile smbFile null; try { smbFile readSmbFile(path); if (!smbFile.exists()) { log.warn(Directory not found: {}, path); return fileInfos; } if (!smbFile.isDirectory()) { log.warn(Path is not a directory: {}, path); return fileInfos; } SmbFile[] files smbFile.listFiles(); if (files ! null) { for (SmbFile file : files) { FileInfo fileInfo new FileInfo(); fileInfo.setName(file.getName()); fileInfo.setSize(file.length()); fileInfo.setDirectory(file.isDirectory()); fileInfo.setLastModified(file.lastModified()); fileInfos.add(fileInfo); } } } catch (Exception ex) { log.error(Failed to list files from path: {}, path, ex); } finally { if (smbFile ! null) { smbFile.close(); } } return fileInfos; } }认证配置NtlmPasswordAuthenticator用于设置 SMB 共享的账号密码域名参数设为null即可大部分局域网共享不需要域名。路径转化需要把Windows的路径转成SMB路径
Java读取共享文件
第一步添加 Maven 依赖首先需要在你的项目中引入 jcifs 的依赖。如果你使用 Maven在pom.xml中添加dependency groupIdorg.codelibs/groupId artifactIdjcifs/artifactId version3.0.2/version /dependencyJava 代码package com.cim.ext.components; import com.cim.ext.dto.FileInfo; import lombok.extern.slf4j.Slf4j; import org.codelibs.jcifs.smb.CIFSContext; import org.codelibs.jcifs.smb.context.SingletonContext; import org.codelibs.jcifs.smb.impl.NtlmPasswordAuthenticator; import org.codelibs.jcifs.smb.impl.SmbFile; import org.codelibs.jcifs.smb.impl.SmbFileInputStream; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; /** * 使用jcifs读取SMB共享文件的工具类 */ Component Slf4j public class SmbFileReader { Value(${smb.user}) private String smbUser; Value(${smb.password}) private String smbPassword; /** * * 把 Windows共享文件的 格式的路径 转成 SMB格式 * param path path * return result */ private String toSmbPath(String path) { // 去空格 if (path ! null) { path path.trim(); } // 空路径 if (path null || path.isEmpty()) { return path; } String smbPath path; // 不是\\开头的路径不做转化 if (!smbPath.startsWith(\\\\)) { // 如果是 smb:// 开头说明本身就是smb路径直接返回 return smbPath; } // 把Windows文件路径的格式转成 smb协议的路径 smbPath smb:// smbPath.substring(2); // 将所有反斜杠替换为正斜杠 smbPath smbPath.replace(\\, /); return smbPath; } public SmbFile readSmbFile(String path) throws MalformedURLException{ // 创建认证器 NtlmPasswordAuthenticator auth new NtlmPasswordAuthenticator( null, // 域名这里不需要填 smbUser, smbPassword ); // 创建CIFS上下文 CIFSContext context SingletonContext.getInstance().withCredentials(auth); // 初始化SMB文件对象 return new SmbFile(toSmbPath(path), context); } public ListFileInfo list(String path) { ListFileInfo fileInfos new ArrayList(); SmbFile smbFile null; try { smbFile readSmbFile(path); if (!smbFile.exists()) { log.warn(Directory not found: {}, path); return fileInfos; } if (!smbFile.isDirectory()) { log.warn(Path is not a directory: {}, path); return fileInfos; } SmbFile[] files smbFile.listFiles(); if (files ! null) { for (SmbFile file : files) { FileInfo fileInfo new FileInfo(); fileInfo.setName(file.getName()); fileInfo.setSize(file.length()); fileInfo.setDirectory(file.isDirectory()); fileInfo.setLastModified(file.lastModified()); fileInfos.add(fileInfo); } } } catch (Exception ex) { log.error(Failed to list files from path: {}, path, ex); } finally { if (smbFile ! null) { smbFile.close(); } } return fileInfos; } }认证配置NtlmPasswordAuthenticator用于设置 SMB 共享的账号密码域名参数设为null即可大部分局域网共享不需要域名。路径转化需要把Windows的路径转成SMB路径