我只是测试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共享
答案 0 :(得分:18)
我发现某处SmbFileInputStream没有自己的缓冲,因此是缓慢的原因。在BufferedInputStream中包装SmbFileInputStream解决了这个问题。
SmbFile sFile = new SmbFile(path, authentication);
BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(sFile));
答案 1 :(得分:17)
就我个人而言,通过JCIFS将文件推送到Windows共享的速度太慢而无法使用。
解决方案原来是定义属性
-Djcifs.resolveOrder=DNS
BCAST的default inclusion - 向255.255.255.255广播NetBIOS名称查询 - 不必要地导致延迟很长时间。 (上面的链接来自top-level API docs。)
答案 2 :(得分:4)
我注意到jCIFS做了什么"" (对于它读取的每个块,afair jcifs.smb.SmbTransport.checkStatus(..))
- 即对于读入缓冲区的每个块。这意味着使用BufferedInputStream
可能真的加快速度,但真正的问题仍然存在。它只是没有&# 39; t经常发生,因此对整体时间的影响较小。
设置" jcifs.util.loglevel = 3 "有很多帮助。并看看真正的错误!
在我的情况下,我必须最后设置"jcifs.smb.client.dfs.disabled=false"
,因为"jcifs.resolveOrder=DNS"
没有帮助..
答案 3 :(得分:2)
如果您可以依赖“其他东西”将共享作为本地目录挂载,那么在Java中读取已挂载共享中的文件应该是可移植的。
即使这不是一个真正的解决方案,也值得尝试一下,看看你是否获得更快的读取率。读取速度显着提高可能会改变您对可移植性相对重要性的看法。如果你没有获得显着的加速,那么你就会知道JCIFS不应该受到责备......
答案 4 :(得分:1)
即使有了现有的建议,我仍然发现JCIFS太慢,无法通过本地网络流式传输视频。这似乎与从网络读取的每个缓冲区的开销有关,甚至读入大缓冲区JCIFS本身具有有限的缓冲区大小,这是问题。
如果查看https://jcifs.samba.org/src/patches/,则会有一个补丁,即LargeReadWrite.patch。你需要应用补丁并重建代码才能使用它,但它对我来说有很大的不同。
答案 5 :(得分:1)
@ Xolve0添加的解决方案也适用于我。尝试写入文件时,SmbFileInput
中的缓冲区问题也存在。我使用相同的BufferedInputStream(new SmbFileInputStream(sFile))
使纯文本文件的执行时间从90秒减少到不到1秒。
识别此特定问题的快捷方法是跟踪打开JCIFS
路径与写入文件本身之间的时间。
答案 6 :(得分:0)
我知道这是一个古老的问题,但是对于尝试其他解决方案却无济于事的其他人:
以我为例,我能够跟踪jcifs使用In [15]: l = [
...: [1, 2, 3, 4],
...: [2, 4],
...: [3, 3, 3]
...: ]
In [16]: list(zip_longest(*l, fillvalue=0))
Out[16]: [(1, 2, 3), (2, 4, 3), (3, 0, 3), (4, 0, 0)]
In [17]: [sum(column)/len(l) for column in zip_longest(*l, fillvalue=0)]
Out[17]: [2.0, 3.0, 2.0, 1.3333333333333333]
的繁重的速度,如果SecureRandom
报告的熵不足,则阻塞了。
安装/dev/random
并配置并启用rng-tools
使性能达到可接受的水平。
您可以使用以下命令check the available entropy(至少在RHEL上):
rngd