使用jcifs复制文件需要很长时间

时间:2013-11-12 08:50:36

标签: java jcifs

我将远程文件从windows shared文件夹复制到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(); 

}

如何减少复制时间?

2 个答案:

答案 0 :(得分:1)

如果需要10个小时来复制200KB,那么您的设置就会出现严重问题。可能存在网络问题,或者您的代码和设置可能会触发jcif或Windows中的错误。启用所有日志记录,并可能使用调试器和配置文件来查看花费的时间。

作为一种快速解决方法,您可以考虑使用不同的协议,如SSH或rsync与SSH。

或者查看一下像XtreemFS这样的远程文件系统(但在你的情况下可能有点过分了。)

答案 1 :(得分:0)

使用缓冲时,从大多数资源流式传输的速度更快。

为此目的使用BufferedInputStreamBufferedOutputStream

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

在关闭OutputStream始终flush() 之前,当任何包装的流使用缓冲时,这是至关重要的。关闭而不冲洗将导致数据丢失。

os.flush();
os.close();
is.close();