How to copy file from SMB share to local drive not in domain with JCIFS

user1922691 picture user1922691 · Feb 7, 2013 · Viewed 20k times · Source

I'm trying to copy some remote files to the local drive, in Java, using JCIFS. The remote machine is inside a domain. The local machine is not in a domain.

The following code works, but it's really slow (2 minutes for 700Kb... and I have many 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();

I think I could use SmbFile.copyTo(), but I don't know how to access the local file. If I write the following, I get a connection error:

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?

Answer

maxmimko picture maxmimko · Jul 11, 2013

You just need to make bigger buffer:

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

Here some test I've done with file 23 Mb, using mentioned code.

bufferSize = 1024 Elapsed time : 10.9587606066 sec

bufferSize = 4096 Elapsed time : 5.6239662951 sec

bufferSize = 5096 Elapsed time : 5.0798761245 sec

bufferSize = 5096 Elapsed time : 4.879439883 sec

bufferSize = 10240 Elapsed time : 4.0192989201 sec

bufferSize = 50240 Elapsed time : 3.8876541543 sec

bufferSize = 100240 Elapsed time : 3.742167582 sec