4

我正在尝试将文件从本地计算机复制到 Windows 服务器中的共享文件夹。这是我使用的功能。

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();
}

我尝试了这个答案,但对我没有用。当我进行正常复制(复制和粘贴)时,一个 25MB 的文件最多只需要8分钟。但是当我使用我的 java 程序使用这个函数时,它需要超过20 分钟。我怎样才能使这个复制更快?提前致谢。

4

6 回答 6

2

以防它帮助其他人......我有一个类似的问题,但在另一个方向(使用 JCIFS 缓慢复制到 Windows)。该问题已通过添加解决

   -Djcifs.resolveOrder=DNS

到属性列表。(BCAST 的默认包含——将 NetBIOS 名称查询广播发送到 255.255.255.255——是造成巨大延迟的原因。)

于 2013-09-16T21:33:25.493 回答
2

如果它仍然很慢,请尝试这个高度优化的功能,然后增加代码中的缓冲区大小。在我的情况下,它将复制 48MB 文件的时间从 10 分钟减少到 1 分钟

public static boolean createCopyOnNetwork(String domain,String username,String password,String src, String dest) throws Exception
{
    //FileInputStream in = null;
    SmbFileOutputStream out = null;
     BufferedInputStream inBuf = null;
    try{
        //jcifs.Config.setProperty("jcifs.smb.client.disablePlainTextPasswords","true");
        NtlmPasswordAuthentication authentication = new NtlmPasswordAuthentication(domain,username,password); // replace with actual values  
        SmbFile file = new SmbFile(dest, authentication); // note the different format
        //in = new FileInputStream(src);
          inBuf = new BufferedInputStream(new FileInputStream(src));
        out = (SmbFileOutputStream)file.getOutputStream();
        byte[] buf = new byte[5242880];
        int len;
        while ((len = inBuf.read(buf)) > 0){
            out.write(buf, 0, len);
        }
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally{
        try{
            if(inBuf!=null)
                inBuf.close();
            if(out!=null)
                out.close();
        }
        catch(Exception ex)
        {}
    }
    System.out.print("\n File copied to destination");
        return true;
}
于 2015-08-27T05:21:41.197 回答
2

我注意到的是,jCIFS 为它读取的每个块做“某事”(公平 jcifs.smb.SmbTransport.checkStatus(..)) - 即对于读入缓冲区的每个块。这意味着增加缓冲区大小可能真的会加快速度,尽管真正的问题仍然存在,但只发生 1 或 2 次,对整体时间的影响较小。

设置“jcifs.util.loglevel=3”有很大帮助,看看到底出了什么问题..

就我而言,我最后必须设置“jcifs.smb.client.dfs.disabled=false”,因为“jcifs.resolveOrder=DNS”没有帮助..

于 2015-10-28T15:12:02.963 回答
1

我遇到了同样的问题。试过 -Djcifs.resolveOrder=DNS 没有运气。在阅读了一些关于缓冲区大小的评论后,我决定走极端并真正提高它。我知道我的传输速率至少应为 50mb/s,因此我将其转换为字节并将其设置为我的缓冲区,它按预期工作。

于 2014-06-30T20:21:08.533 回答
1

有一些新的 SMB java 项目支持 SMB2 及以上,我想你可以试试。

请注意,SMB2 比 SMB1 (jCifs) 更好、更快、更安全

于 2018-05-15T14:19:56.217 回答
0

我比较了将大缓冲区写入共享文件夹中的文件所需的时间。smbj 比 jcifs 快 10 倍以上!

于 2021-06-21T12:11:36.857 回答