Question

I'm currently using commons-net library for FTP client in my app. I have to download from remote server some files, by some criteria based on the file name. This is a very simplified and reduced version of my actual code (because I do some checks and catch all possible exceptions), but the essence is there:

//ftp is FTPClient object
//...
files = ftp.listFiles();
for (FTPFile ftpFile : files) {
    String name = ftpFile.getName();
    if(conformsCriteria(name)) {

        String path = outDirectory + File.separatorChar + name;
        os = new FileOutputStream(path);

        ftp.retrieveFile(name, os);
    }
}

Now, what I noticed is that when I run this code, wait a few seconds, and then plug out network cable, output directory contains some "empty" files plus the files actually downloaded, which leads me to believe that this method is working somewhat asynchronously... But then again, some files are downloaded (size > 0KB), and there are these empty files (size = 0KB), which leads me to believe that it is still serialized download... Also, function retrieveFile() returns, I quote documentation:

True if successfully completetd, false if not

What I need is serialized download, because I need to log every unsuccessful download.
What I saw browsing through the commons-net source is that, if I'm not wrong, new Socket is created for each retrieveFile() call.

I'm pretty confused about this, so If someone could explain what is actually happening, and offer solution with this library, or recommend some other FTP java library that supports blocking download per file, that would be nice.

Thanks.

Was it helpful?

Solution 2

Ok, to briefly answer this in order not to confuse people who might see this question.
Yes, commons-net for FTP is working as I thought it would, that is, retrieveFile() method blocks until it's finished with the download.
It was (of course) my own "mistake" in the code that let me think otherwise.

OTHER TIPS

You could just use the java.net.URLConnection class that has been present forever. It should know how to handle FTP URLs just fine. Here is a simple example that should give the blocking behavior that you are looking for.

The caveat is that you have to manage the input/output streams yourself, but this should be pretty simple.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top