已知目标Windows服务器IP和路径,Java SMB跨服务器存文件路径配置问题
问题分析与解决方案
你的核心问题是错误地用本地File类操作远程Windows服务器的SMB共享,同时目标路径格式不符合SMB协议要求。以下是具体修正方案:
1. toServer变量的正确格式
目标路径必须遵循SMB协议格式,结构为:
smb://目标服务器IP/共享文件夹名/子文件夹路径/
比如目标服务器IP是192.168.1.100,共享文件夹叫data,要放到data下的backup文件夹里,那toServer应该写:
String toServer = "smb://192.168.1.100/data/backup/";
2. 代码核心修正:用SmbFile替代本地File
因为目标是远程SMB共享,不能用本地FileOutputStream写入,必须用jcifs库的SmbFile来创建远程文件并写入。同时需要处理SMB认证(如果目标服务器需要用户名密码)。
修改后的完整代码示例:
import jcifs.smb.NtlmPasswordAuthentication; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class SmbFileMover { public static void main(String args[]) throws Exception { String from = "smb://源服务器IP/共享名/tmp/"; // 目标SMB路径 String toServer = "smb://目标服务器IP/共享名/目标文件夹路径/"; String filename = "someFileName.xml"; // SMB认证信息(如果目标服务器需要账号密码) NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, "目标服务器用户名", "目标服务器密码"); moveSmbFileToServer(from, toServer, filename, auth); } public static void moveSmbFileToServer(String smbPathFrom, String pathTo, String fileName, NtlmPasswordAuthentication auth) throws Exception { SmbFile smbFileFrom = new SmbFile(smbPathFrom + fileName); // 用SmbFile创建远程目标文件,传入认证信息 SmbFile smbFileTo = new SmbFile(pathTo + fileName, auth); InputStream is = null; OutputStream os = null; try { is = smbFileFrom.getInputStream(); os = new SmbFileOutputStream(smbFileTo); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } // smbFileFrom.delete(); 测试通过后取消注释 } finally { if (is != null) is.close(); if (os != null) os.close(); } } }
3. 注意事项
- 确保目标服务器的SMB共享已开启,且你使用的账号拥有写入权限
- 如果目标服务器是域环境,
NtlmPasswordAuthentication的第一个参数填域名,比如new NtlmPasswordAuthentication("DOMAIN", "user", "pass") - 检查jcifs库版本,不同版本的API可能略有差异(比如新版本可能用
SmbSession处理认证)
内容的提问来源于stack exchange,提问作者Fra
相关产品推荐
相关产品推荐

