12

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

最初の出力が来るまでに非常に長い時間がかかり、その後の読み取りも非常に遅くなります。それを使用する方法はありますか?ポータブルな方法で Windows 共有にアクセスするための Java コードを記述できる代替手段も歓迎します

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 に答える
2

共有をローカルディレクトリとしてマウントするために「何か他のもの」に頼ることができる場合、マウントされた共有内のファイルをJavaで読み取ることは移植可能です。

これが実際の解決策ではない場合でも、これを試して、読み取り速度が速くなるかどうかを確認する価値があります。読み取り速度が大幅に高速化されると、移植性の相対的な重要性について考えが変わる可能性があります。そして、大幅な高速化が得られない場合は、JCIFS のせいではないことがわかります...

于 2012-05-10T12:18:19.407 に答える