12

我只是在测试JCIFS以访问 Windows 共享。它非常慢,以至于完全无法使用。

import jcifs.smb.*;

class First {
    public static void main(String[] args) throws Exception {
    try {
        //jcifs.Config.setProperty( "jcifs.netbios.wins", "192.168.1.220" );
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain.com", "Administrator", "password");

        SmbFile f = new SmbFile("smb://10.17.15.12/Share/xml/file.xml", auth);
        SmbFileInputStream in = new SmbFileInputStream(f);
        byte[] b = new byte[8192];
        int n;
        while(( n = in.read( b )) > 0 ) {
        System.out.write( b, 0, n );
        }
    } catch (SmbException smbe) {
        System.err.println(smbe.getNtStatus());
        System.err.println(smbe.toString());
        System.err.println(smbe.getCause());
    }
    }
}

初始输出需要很长时间,后续读取也很慢。任何想法如何使用它?也欢迎我可以编写 Java 代码以可移植方式访问 Windows 共享的任何替代方法

4

7 回答 7

20

我在某处发现 SmbFileInputStream 不做自己的缓冲,因此是慢的原因。将 SmbFileInputStream 包装在 BufferedInputStream 中解决了这个问题。

 SmbFile sFile = new SmbFile(path, authentication);

 BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(sFile));
于 2012-05-11T20:31:27.393 回答
18

在我自己的情况下,通过 JCIFS 将文件推送到 Windows 共享太慢而无法使用。

解决方案原来是定义属性

-Djcifs.resolveOrder=DNS

BCAST的默认包含——将 NetBIOS 名称查询广播到 255.255.255.255——不必要地导致了长时间的延迟。(上面的链接来自顶级 API 文档。)

于 2013-09-16T21:39:01.357 回答
5

我注意到的是 jCIFS 做了“一些事情”(jcifs.smb.SmbTransport.checkStatus(..))对于它读取的每个块来说都是公平的 - 即对于读入缓冲区的每个块。这意味着使用 aBufferedInputStream可能真的会加快速度,但真正的问题仍然存在。它只是没有t 像以前一样经常发生,因此对总时间的影响较小。

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

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

于 2015-10-29T10:27:16.543 回答
2

如果您可以依靠“其他东西”将共享挂载为本地目录,那么在 Java 中读取挂载共享中的文件应该是可移植的。

即使这不是一个真正的解决方案,也值得尝试一下,看看您是否能获得更快的读取速度。明显更快的读取速度可能会改变您对便携性相对重要性的看法。如果你没有得到显着的加速,那么你就会知道 JCIFS 不应该受到责备......

于 2012-05-10T12:18:19.407 回答
1

即使有现有的建议,我仍然发现 JCIFS 太慢,无法通过我的本地网络传输视频。这似乎与从网络读取的每个缓冲区的开销有关,即使读取到大缓冲区 JCIFS 本身的缓冲区大小也是有限的,这就是问题所在。

如果您查看https://jcifs.samba.org/src/patches/有一个补丁,LargeReadWrite.patch。您需要应用补丁并重建代码才能使用它,但这对我来说有很大的不同。

于 2017-09-06T08:53:28.220 回答
1

@Xolve0 添加的解决方案也对我有用。SmbFileInput尝试写入文件时也存在缓冲区问题。我使用相同BufferedInputStream(new SmbFileInputStream(sFile))的方法使纯文本文件的执行时间从 90 秒减少到不到一秒。

识别此特定问题的一种快速方法是跟踪JCIFS路径打开和文件本身写入之间的时间。

于 2017-12-28T15:58:45.987 回答
0

我知道这是一个老问题,但对于其他尝试过其他解决方案无济于事的人来说:

就我而言,我能够跟踪 jcifs大量使用的减速SecureRandom,如果/dev/random报告熵不足,它会阻止。

安装rng-tools、配置和启用rngd使性能达到可接受的水平。

您可以使用以下命令检查可用的熵(至少在 RHEL 上):

cat /proc/sys/kernel/random/entropy_avail
于 2019-04-02T11:53:09.653 回答