4

JCIFS を使用して、Java でいくつかのリモート ファイルをローカル ドライブにコピーしようとしています。リモート マシンはドメイン内にあります。ローカル マシンがドメイン内にありません。

次のコードは機能しますが、非常に遅いです ( 700Kbで 2 分...そして多くの Mb があります...):

SmbFile remoteFile = new SmbFile("smb://...")
OutputStream os = new FileOutputStream("/path/to/local/file");
InputStream is = remoteFile.getInputStream();
int ch;
while ((ch = is.read()) != -1) {
    os.write(ch);
}
os.close();
is.close();

SmbFile.copyTo() を使用できると思いますが、ローカル ファイルにアクセスする方法がわかりません。次のように書くと、接続エラーが発生します。

localfile = new SmbFile("file:///path/to/localfile")

この質問は、Java で jcifs を使用して smb 共有からローカル ドライブにファイルをコピーする方法に関連していますか?

4

3 に答える 3

5

より大きなバッファを作成する必要があります:

SmbFile remoteFile = new SmbFile("smb://...")
try(OutputStream os = new FileOutputStream("/path/to/local/file")){
try(InputStream is = remoteFile.getInputStream())
{
    int bufferSize = 5096;

    byte[] b = new byte[bufferSize];
    int noOfBytes = 0;
    while ((noOfBytes = is.read(b)) != -1) {
        os.write(b, 0, noOfBytes);
    }
}}

ここで、言及されたコードを使用して、ファイル 23 Mb で行ったいくつかのテストを示します。

bufferSize = 1024 経過時間: 10.9587606066 秒

bufferSize = 4096 経過時間: 5.6239662951 秒

bufferSize = 5096 経過時間: 5.0798761245 秒

bufferSize = 5096 経過時間: 4.879439883 秒

bufferSize = 10240 経過時間: 4.0192989201 秒

bufferSize = 50240 経過時間: 3.8876541543 秒

bufferSize = 100240 経過時間: 3.742167582 秒

于 2013-07-11T06:46:50.807 に答える
4

SmbFile オブジェクトは、有効なsmb URL以外では構築できません。http://jcifs.samba.org/src/docs/api/のコンストラクターの概要と、上部の SmbFile URL に関する説明を参照してください。

SmbFile URL の構文は次のとおりです: smb://[[[domain;]username[:password]@]server[:port]/[[share/[dir/]file]]][?[param=value[param2 =値2[...]]]

そのため、本当に入力ストリームを使用せずに copyTo() を使用したい場合は、jCIFS を指すことができる SMB 共有をローカル マシンに用意する必要があります。

ローカル マシンが Windows マシンの場合、C$ など、アクセスできるデフォルトの共有がいくつかあります。

したがって、次のようなことができます。

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "username", "password") //or whatever authentication works on your local machine.
SmbFile myFile = new SmbFile("smb://localhost/C\$/path/to/localfile", auth)

次に、を使用できますremoteFile.copyTo(myFile)

Windows ホストを使用していない場合は、Samba をインストールし、ローカル マシンに接続するための Samba 共有をセットアップする必要があります。

于 2013-03-01T21:26:15.187 に答える