2012-05-10 39 views
10

我只是在考驗JCIFS訪問Windows共享太慢。它完全無法使用的速度非常緩慢。JCIFS:文件檢索是要使用

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共享在便攜方式的任何替代方案,也歡迎

回答

18

我發現某處SmbFileInputStream不做自己的緩衝,因此是緩慢的原因。用BufferedInputStream包裝SmbFileInputStream解決了這個問題。

SmbFile sFile = new SmbFile(path, authentication); 

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

我知道這是一箇舊的答案,但源代碼鏈接似乎已經過時。 – Vish

2

如果你能靠「別的東西」裝入共享作爲本地目錄你,然後在讀取文件在Java中安裝共享應該是可移植的。

即使這不是一個真正的解決方案,它將如果你得到一個更快的讀取速度是值得嘗試這一看到。明顯更快的讀取速度可能會改變您對可移植性的相對重要性的看法。如果你沒有得到顯着的加速,那麼你會知道,JCIFS不是怪...

15

在我自己的情況下,通過JCIFS將文件推送到Windows共享太慢,無法使用。

溶液竟然是定義屬性

 
-Djcifs.resolveOrder=DNS 

BCAST的default inclusion - 廣播NetBIOS名稱查詢到255.255.255.255 - 被不必要地導致了長的延遲。 (以上鍊接去成幀從top-level API docs

+0

這是一個很棒的發現! – Xolve

+1

謝謝!肯定踢了一個星期的底部.... – Glenn

+3

jcifs.Config.setProperty(「resolveOrder」,「DNS」);也拯救了我的生命!謝謝!! – Exceptyon

2

我注意到的是,JCIFS確實爲每次讀取數據塊「東西」(AFAIR jcifs.smb.SmbTransport.checkStatus(..)) - 即對於被讀入緩衝區每塊這意味着使用BufferedInputStream可能真的會加快速度,但真正的問題仍然存在,它不會像以前那樣頻繁出現,因此對整體時間的影響較小。

它有助於設置「jcifs.util .loglevel = 3「,看看有什麼不對!

在我的情況下,我不得不在最後設置"jcifs.smb.client.dfs.disabled=false",因爲"jcifs.resolveOrder=DNS"沒有幫助..

1

即使我仍然發現流的視頻在我的本地網絡JCIFS太慢現有的建議。似乎是從網絡讀取每個緩衝區的開銷,即使讀入大緩衝區,JCIFS本身的緩衝區大小也是有限的,這是問題所在。

如果您在https://jcifs.samba.org/src/patches/期待有一個補丁,LargeReadWrite.patch。您需要應用該補丁並重新構建代碼才能使用它,但對我而言,這是一個很大的改變。

+0

優秀的發現:-) – Xolve

0

由@ Xolve0添加的解決方案也適用於我。嘗試寫入文件時,SmbFileInput中的緩衝區問題也存在。對於純文本文件,我使用相同的BufferedInputStream(new SmbFileInputStream(sFile))使時間執行從90秒減少到不到1秒。

一個快速的方法來識別這個具體問題將是跟蹤JCIFS路的開口和文件本身的寫之間的時間。