SMB共有からJCIFSのドメインにないローカルドライブにファイルをコピーする方法

私は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")

This question is related to How to copy file from smb share to local drive using jcifs in Java?

4

3 答え

より大きなバッファを作成するだけです。

   SmbFile remoteFile = new SmbFile("smb://...")
   OutputStream os = new FileOutputStream("/path/to/local/file");
   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);
                  }
                    os.close();
                    is.close();

ここでは、上記のコードを使用して23MBのファイルを使っていくつかのテストを行いました。

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秒

5
追加された
そのため、あまりにも多くの時間をかけてInputStreamを作成し、コピー先のファイルにコピーします。私は1KBのファイルを持っていて、アクティビティを終了するのに1分以上かかっていました。それを速くする方法はありますか?
追加された 著者 Jaikrat,

SmbFileオブジェクトは、有効な smb URLを使用して除外できません。コンストラクタの概要については、 http://jcifs.samba.org/src/docs/api/ と、トップにあるSmbFileのURLについての議論があります。

SmbFileのURLの構文は次のとおりです。   smb:// [[ドメイン;]ユーザ名[:パスワード] @]サーバ[:ポート]/[[共有/ [ディレクトリ/]ファイル]]] [?[param = value [param2 = value2 [...] ]]

したがって、入力ストリームの使用を避けて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共有をセットアップする必要があります...また、inputStreamの使用を避けることを絶対に避けているならば。

4
追加された
remoteFile とは何ですか?
追加された 著者 Jaikrat,
ああ、ありがとう。私はこれとその作業を実装しました。しかし、そのtoooooはInputStreamとコピーを作るのに多くの時間を要します。それを速くする方法はありますか?
追加された 著者 Jaikrat,
特に、nagualjjは、 "C:/ path/to/file"の形式も使用できることを示していますが、これは成功しませんでした。 stackoverflow.com/questions/13359164
追加された 著者 jonnybot,
元の質問から、 remoteFile はOPが別の場所(この場合は myFile )にコピーしたいSmbFileです。
追加された 著者 jonnybot,

@maxmimkoの答えの代わりに、Apache Commons IOライブラリを利用して、 IOUtils を使ってコピーを処理することもできます。

NtlmPasswordAuthentication creds = new NtlmPasswordAuthentication("domain", "user", "password");
SmbFile remoteFile = new SmbFile("smb://REMOTEHOST/SHARE/path/to/file", creds);
try (
    InputStream is = remoteFile.getInputStream();
    OutputStream os = new FileOutputStream("/path/to/local/file");
) {
    long bytesCopied = IOUtils.copyLarge(is, os);
} catch (IOException e) {
   //handle exception here; log it?
}
// streams are automatically closed by try-with-resources block

バッファサイズを制御したいのであれば IOUtils.copyLarge(InputStream is、OutputStream os、byte [] buffer)もありますが、コード>を全面的に比較的良いものにすることができます。

4
追加された