我正在尝试将文件从本地计算机复制到Windows服务器中的Shared文件夹。这是我使用的功能。
public static void copyFileUsingJcifs(final String domain, final String userName, final String password, final String sourcePath, final String destinationPath) throws IOException {
final NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(domain, userName, password);
final SmbFile sFile = new SmbFile(destinationPath, auth);
final SmbFileOutputStream smbFileOutputStream = new SmbFileOutputStream(sFile);
final FileInputStream fileInputStream = new FileInputStream(new File(
sourcePath));
final byte[] buf = new byte[16384];
int len;
while ((len = fileInputStream.read(buf)) > 0) {
smbFileOutputStream.write(buf, 0, len);
}
fileInputStream.close();
smbFileOutputStream.close();
}
我尝试this回答,但对我不起作用。当我进行正常复制(复制和粘贴)时,25MB文件最多只需 8分钟。但是当我使用我的java程序使用这个函数时,它需要超过 20分钟。如何更快地复制? 提前谢谢。
答案 0 :(得分:1)
如果它有助于其他人...我有类似的问题,但在另一个方向(使用JCIFS慢速复制到Windows)。通过添加
解决了该问题-Djcifs.resolveOrder=DNS
到属性列表。 (BCAST的default inclusion - 将NetBIOS名称查询广播发送到255.255.255.255 - 是造成巨大延迟的原因。)
答案 1 :(得分:1)
我遇到了同样的问题。尝试-Djcifs.resolveOrder = DNS没有运气。在阅读了一些缓冲区大小的评论之后,我决定走极端,真正提升它。我知道我的传输速率至少应该是50mb / s所以我将其转换为字节并将其设置为我的缓冲区并且它按预期工作。
答案 2 :(得分:1)
我注意到jCIFS为它读取的每个块执行“某事”(afair jcifs.smb.SmbTransport.checkStatus(..)) - 即对于读入缓冲区的每个块。这意味着增加缓冲区大小可能会加快速度,虽然真正的问题仍然存在,但只发生1到2次,对整体时间的影响较小..
设置“jcifs.util.loglevel = 3”有很多帮助,看看有什么不对。
在我的情况下,我最后必须设置“jcifs.smb.client.dfs.disabled = false”,因为“jcifs.resolveOrder = DNS”没有帮助..
答案 3 :(得分:1)
有一些新的SMB java项目支持SMB2及以上版本,我想你可以尝试一下。
请注意,SMB2比SMB1(jCifs)更好,更快,更安全
答案 4 :(得分:0)
我比较了将大缓冲区写入共享文件夹中的文件所需的时间。 smbj 比 jcifs 快 10 倍以上!