2

Windows共有フォルダーからLinuxマシンにリモートファイルをコピーしています。コピーに時間がかかります。320 MB のうち、10 時間でコピーされたのは 200 KB だけです。

ここに私のコードスニペットがあります:

try {
    String user = "xxxx";
    String pass ="yyyy";    
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
            user, pass);
    String sharepath ="smb://aa.bb.com/root/Test/Access.mdb";           
    SmbFile remoteFile = new SmbFile (sharepath, auth);

    OutputStream os = new FileOutputStream("/home/test/Access.mdb");
    InputStream is = remoteFile.getInputStream();
    int ch;
    while ((ch = is.read()) != -1) {
        os.write(ch);
    }
    os.close();
    is.close();

} catch (Exception e) { 
    e.printStackTrace(); 

}

コピーにかかる時間を短縮するにはどうすればよいですか?

4

2 に答える 2

1

200KB をコピーするのに 10時間かかる場合は、セットアップに重大な問題があります。ネットワークに問題があるか、コードとセットアップが jcifs または Windows でバグを引き起こす可能性があります。すべてのロギングを有効にし、デバッガーとプロファイルを使用して、時間が費やされている場所を確認します。

簡単な回避策として、SSH や rsync with SSH などの別のプロトコルを使用することを検討してください。

または、 XtreemFSのようなリモート ファイル システムを調べてください (ただし、あなたのケースではやり過ぎかもしれません)。

于 2013-11-12T09:17:41.997 に答える
0

バッファリングを使用すると、ほとんどのリソースとの間のストリーミングが高速になります。

その目的のためにBufferedInputStreamとを使用します。BufferedOutputStream

OutputStream os = new BufferedOutputStream(new FileOutputStream("/home/test/Access.mdb"));
InputStream is = new BufferedInputStream(remoteFile.getInputStream());

OutputStreamラップされたストリームのいずれかがバッファリングを使用する場合、 、alwaysflush()を閉じる前に、これは非常に重要です。フラッシュせずに閉じると、データが失われます。

os.flush();
os.close();
is.close();
于 2013-11-12T09:02:42.097 に答える