Hi
i am trying to get some files from a FTP Server. When i use
retrieveFile(), it works, but i would like to add some listeners to it
(how many bytes got transfered etc.) so i used retrieveFileStream().
Now i get some exceptions and no files are downloaded.
This is the part of the code:
@Override public void run() {
try {
new File(destDir).mkdirs();
final File outFile =new File(destDir,ftpFile.getName());
final FileOutputStream fos =new FileOutputStream(outFile);
final InputStream inputStream =client.retrieveFileStream(sourceDir
+ftpFile.getName());
byte b[] =new byte[4096];//todo: would be nice to have such stuff in the appl conf so users can
config it long bytesWritten =0;
while (inputStream.read(b) != -1) {
fos.write(b);
bytesWritten += b.length;
informDetailListeners(sourceDir +ftpFile.getName(), bytesWritten);
bytesTransferedTotal += b.length;
informListeners(bytesTransferedTotal);
}
client.completePendingCommand();
informListenersWeFinishedOneFile(sourceDir +ftpFile.getName(),
bytesWritten);
fos.flush();
fos.close();
System.out.println(client.getReplyString());
}catch (Exception ex) {
System.out.println(client.getReplyString());
ex.printStackTrace();
}
}
The NullpointerException occurs in retrieveFileStream() - when i step
into it i will get to FTPClient.java where it says:
final boolean isInet6Address =getRemoteAddress()instanceof Inet6Address;
getRemoteAddress() has this:return _socket_.getInetAddress();
When i try to debug into this, it just jumps into my catch block with a
NullPointerException.
When i add this method as watch, it says socket not connected - but it must be
connected ?!
The initialisation of the ftp Client is here:
private void downloadTo(String destinationDir)throws IOException {
//first, create the destination directory so we can write into that final File file
=new File(destinationDir +"/" +sfdlFile.getDescription());
file.mkdirs();
//set up the connection and go to the directory we want final
ConnectionInfo connectionInfo =sfdlFile.getConnectionInfo();
final String sourceDir =sfdlFile.getRemoteSourceDir();
final FTPClient client =new FTPClient();
client.connect(connectionInfo.getHost(), connectionInfo.getPort());
System.out.println(client.getReplyString());
client.enterLocalPassiveMode();
System.out.println(client.getReplyString());
client.login(connectionInfo.getUsername(), connectionInfo.getPassword());
System.out.println(client.getReplyString());
client.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println(client.getReplyString());
client.changeWorkingDirectory(sourceDir);
System.out.println(client.getReplyString());
//now retrieve all files, recursive final ScheduledExecutorService
scheduledExecutorService =
Executors.newScheduledThreadPool(sfdlFile.getMaxThreads());
downloadDirectory(client, sourceDir, destinationDir +"/"
+sfdlFile.getDescription(), scheduledExecutorService);
client.disconnect();
System.out.println(client.getReplyString());
//inform our downloader we finished }
The FTP Client is connected, the login worked, i get a lot of output from the
Server which seems to be fine.
Can someone tell me whats wrong with that code? Is there something i did not
read in handling recursive downloads of (bigger) files ?
The output in my intellij:
220 >>>>>>>>>>>>>>>>>>>>>>>>>
230 User logged in, proceed.
200 Type set to I.
250 Directory changed to /somedirectory
null
null
java.lang.NullPointerException
at
org.apache.commons.net.SocketClient.getRemoteAddress(SocketClient.java:672)
at
org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:819)
at
org.apache.commons.net.ftp.FTPClient._retrieveFileStream(FTPClient.java:1984)
at
org.apache.commons.net.ftp.FTPClient.retrieveFileStream(FTPClient.java:1971)
at
de.trustserv.jsfdl.app.sfdl.SFDLFileDownloader$DownloadRunnable.run(SFDLFileDownloader.java:145)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)