性能:使用JCIF将文件复制到Windows网络的速度很慢

时间:2013-08-08 06:41:58

标签: java performance smb jcifs

我正在尝试将文件从本地计算机复制到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分钟。如何更快地复制? 提前谢谢。

5 个答案:

答案 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 倍以上!