JCIFS:文件检索速度太慢,无法使用

2022-09-05 00:00:02

我只是在测试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共享的替代方案也都受到欢迎


答案 1

我在某处发现SmbFileInputStream不进行自己的缓冲,因此速度很慢。将 SmbFileInputStream 包装在 BufferedInputStream 中解决了这个问题。

 SmbFile sFile = new SmbFile(path, authentication);

 BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(sFile));

答案 2

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

解决方案原来是定义属性

-Djcifs.resolveOrder=DNS

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


推荐