site :
  home page

about FinJ :
  online API
  what's next ?

miscellaneous :
  JUnit testing

resources :
  LGPL license


finj - News of the past

[ L A S T   U P D A T E   :   2018-01-08 ]

> 2009-07-15 : Release 1.1.5

Dear Finjes,

  • Recently fixed :
    • method org.finj.FTClient.getFileDescriptors(String) :
      bug with command result parsing.


        -- javier

> 2008-01-18 : Release 1.1.4

Dear Finjes,

  • Recently fixed :
    • method org.finj.FTClient.getFileDescriptors(String) :
      bug with year parsing.
  • Recently added :
    • Italian translation of FTP response messages :
      many thanks to Guido Pes for this contribution.


        -- javier

> 2007-10-12 : Release 1.1.3

Dear Finjes,

  • Recently fixed :
    • method org.finj.FTClient.getFileDescriptors(String, boolean) :
      Truncated remote filenames with spaces.


        -- javier

> 2007-05-16 : Release 1.1.2

Dear Finjes,

  • Recently fixed :
    • method :


        -- javier

> 2006-11-13 : maven and subversion

Dear Finjes,

Please note that from now on, the finj source code is directly available from the SourceForge subversion servers:

The project is now managed / compiled / tested / packaged /... under Apache Maven 2

  • Recently implemented :
    • method org.finj.FTPClient.getFileDescriptors() :
      Initial implementation based on a contribution of Hector Mauricio Gonzalez.


        -- javier

> 2003-10-22 : some new stuff

Here are a few updates to the finj project!

The most important new feature is the new "profiles" that embody the differences between a specific FTP server implementation and the strict definition of the FTP protocol. This is important as some well known servers require some twists in finj to work properly.

The idea behind this would be to build a collection of profiles for the most common servers used out there, and a way to automatically detect the right profile to use for connections, to ensure both interoperability and that finj will be able to keep on reporting all problems in the communication through org.finj.FTPException.

There is still work to do in this matter, specially in the field of automatic profile determination!

  • Recently implemented :
    • class org.finj.FTPServerProfile :
      A solution for handling FTP servers that don't strictly stick to the RFC-959. It also helped to significantly clean org.finj.FTPClient
    • package org.finj.profile :
      Where the different profiles will be stored.
    • class org.finj.profile.StrictFTPServerProfile :
      All the validation code that once was in org.finj.FTPClient has now been moved in this class that can be extended to define differences with the RFC.
  • Documentation :
    Updated API documentation. The documentation about profiles is not ready yet, so please refer to the API. If someone wants to contribute to this task, let me know!

It might be the time to find a logo for finj. Any suggestions?

        -- javier

> 2002-11-24 : update of the web site

I really have problems to find time for finj, not because of the lack of interest from me or other people, not because the project is useless, but simply because the problems that are left to implement are tricky  :

  • treat file details in a FTP server independent way ;
  • handle FTP servers that do not carefully implement RFC-959 ;
  • implement encrypted transfers ;
  • thread-safe data transfers ;
  • ...

There is still room for dedicated programers :)

It is interresting to note that I usually receive 2-4 mails per week coming from people interested in including finj into their projects, but only few of them contribute to it. Damn !

Well... nevertheless, I spent some time refactoring this web site, and I'll spend some time on the source code the next days, trying to solve some known bugs. More news about that subject in the next weeks.

        -- javier

> 2001-11-24 : still beta source code, changes to API (v1.0.2)

After a long time without any (visible) activity, here are some news from finj :

  • Documentation :
    Some new documents have been added to this web site :
    • mini-howto :
      Simple example class to show how to use finj in a really basic way.
    • test :
      Info on the way JUnit is used for unit testing.
    • alternatives :
      Don't like finj but need FTP in your Java App ? Here are some pointers on other projects available out there.
  • Recently implemented :
    • ASCII data transfer,
    • EBCDIC data transfer,
    • append to a file,
    See Project-o-meter for details !
  • finj API : MODIFIED
    I finally learned how to use javadoc properly :)
    • org.finj.FTPReply.startsMultilineAnswer(String) :
      deprecated, replaced by opensMultilineAnswer(String).
    • org.finj.FTPClient.dataReceived(int) :
      protected (was public for some weird, forgotten reason).
    • org.finj.FTPClient.doPASSCommand(String)
      deprecated, replaced by FTPClient.doPASSCommand(char[]), see below.
    • org.finj.FTPClient.getFileInPassiveMode(OutputStream,String)
      deprecated, replaced by getFile(OutputStream,String,boolean), see below.
    • org.finj.FTPClient.getFileNamesInPassiveMode(String)
      (brand new and already) deprecated, replaced by getFileNames(String,boolean), see below.
    • org.finj.FTPClient.login(String,String)
      deprecated, replaced by FTPClient.login(String,char[]), see below.
    • org.finj.FTPClient.putFileInPassiveMode(InputStream,String)
      deprecated, replaced by putFile(InputStream,String,boolean), see below.
    • org.finj.FTPClient(String,String,String)
      deprecated, replaced by FTPClient(String,String,char[]), see below.
    • org.finj.FTPClient(String,String,String,Locale)
      deprecated, replaced by FTPClient(String,String,char[],Locale), see below.
    • org.finj.FTPClient(String,int,String,String)
      deprecated, replaced by FTPClient(String,int,String,char[]), see below.
    • org.finj.FTPClient(String,int,String,String,Locale)
      deprecated, replaced by FTPClient(String,int,String,char[],Locale), see below.
  • package org.finj.test : CREATED
    Contains several classes that use JUnit framework to test finj while developing.
    • org.finj.test.AllTest
      Executes all the other tests,
    • org.finj.test.BrowsingTest
      Tests browsing related functionalities,
    • org.finj.test.ConnectionTest
      Tests connection realated functionalities,
    • org.finj.test.DataTest
      Tests data transfer related functionalties,
    • org.finj.test.InformationTest
      Tests server information collection functionalities,
    • org.finj.test.MiscellaneousTest
      Tests functionalities that do not enter in the other categories,
    • org.finj.test.ObserverTest
      Tests org.finj.FTPClientObserver functionalities.
    Those classes use org.finj.test.FTPClientTest, a "modified" version of org.finj.FTPClient that get configuration details from a configuration file :
    More details on testing are collected on testing page.
  • package org.finj.filter : CREATED
    Contains and that are placed on the data streams when up/downloading data to/from a FTP server.
    • org.finj.filter.ASCIIDataFilterInputStream
    • org.finj.filter.EBCDICDataFilterInputStream
    • org.finj.filter.ImageDataFilterInputStream
    • org.finj.filter.LocalASCIIDataFilterInputStream
    At the moment, it offers ASCII, EBCDIC and binary data transfers implementations, but the principle could be used for "on the fly" cryptography, data compression, or whatever feature that could be imagined.
    Any suggestions ?
  • public class org.finj.FTPClient : MODIFIED
    Better (?) support for passive transfers was added, visible through several methods :
    • org.finj.FTPClient.usePassiveDataTransfer(boolean) :
      to switch it on and off,
    • org.finj.FTPClient.usePassiveDataTransfer() :
      to know if it is on or off (off by default),
    • org.finj.FTPClient.getFile(OutputStream,String,boolean) :
      added, third argument overriding usePassiveDataTransfer()
    • org.finj.FTPClient.putFile(InputStream,String,boolean) :
      added, third argument overriding usePassiveDataTransfer()
    • org.finj.FTPClient.putUniqueFile(InputStream,boolean) :
      added, second argument overriding usePassiveDataTransfer(),
    • org.finj.FTPClient.getFileNames(String,boolean) :
      added, second argument overriding usePassiveDataTransfer(),
    • org.finj.FTPClient.getFileNames(boolean) :
      added, argument overriding usePassiveDataTransfer(),
    Stronger security in the way password is handled, through a char[] rather than a java.lang.String. It is recommended that the character array be cleared after use by setting each character to zero.
    Methods added to the API :
    • org.finj.FTPClient(String,String,char[])
    • org.finj.FTPClient(String,String,char[],Locale)
    • org.finj.FTPClient(String,int,String,char[])
    • org.finj.FTPClient(String,int,String,char[],Locale)
    • org.finj.FTPClient.login(String,char[])
    • org.finj.FTPClient.doPASSCommand(char[])
    Bugfixes :
    • open(String,int) modified to take into account multiple IP addresses
      bug #451577, thanks to Gerritt Cap,
    • readFTPReply() modified for better end of multiline reply detection
      and readLineFromControlConnection() modified to discard empty lines
      This bug was REALLY annoying, because it was difficult or impossible to connect to IIS FTP servers !
      bug #451582, thanks to Gerritt Cap.
  • public class org.finj.FTPReply : MODIFIED
    • org.finj.FTPReply.opensMultilineAnswer(String) :
    • org.finj.FTPReply.closesMultilineAnswer(String) :
  • public class org.finj.FTPSocket : CREATED
    Allows to handle and instances in a transparent and elegant way, even if they have no common ancestor, through wrapping in an interface that mimics their common parts.

        -- javier

> 2001-04-16 : beta version of source code, small changes to API (v1.0.1)


I finally got some time for finj :

  • public class org.finj.FTPClient : MODIFIED
    setPassive() was public, set to private (it didn't make no sense),
    setDataPort(*) were public, set to private (it didn't make no sense),
    getDataPort() was removed (it didn't make no sense),
    putFileInPassiveMode(InputStream,String) was implemented by Syed Meerkasim,
    getFileInPassiveMode(OutputStream,String) was added,
    readMultilineReply(FTPReply), getServerStatus() and getServerStatus(java.lang.String) now return String[] instead of String.
    getWorkingDirectory() now returns the correct (?) parsed value,
    getFileNames() was implemented,
    a brand new verbose mode has been added for debugging purposes.
  • public class org.finj.FTPConstants : CREATED
    gathers the project-wide constants.
  • public class org.finj.FTPReply : MODIFIED
    parseServerPassivePort() was implemented by Syed Meerkasim,
    parseWorkingDirectory() was added.
  • public class org.finj.RemoteFile : MODIFIED
    was an interface... because of a previous implementation of this system that is now out of date,
    canWrite() was added.

        -- javier

> 2001-04-05 : Current status of project finj

Hi all,

Thank you ! I recieved a lot of feedback... even debugged code, and enhancements propositions.

Two developers joined the crew (Syed Meerkasim and Otto Mok).

Expect to have an alpha version - current is draft - of the source code available soon (if they leave me alone for a while at work :)

Well : this tiny project is taking some altitude ! Maybe a CVS server would be nice...

And of course : this project is *not* dead !

        -- javier

> 2000-11-24 : API v1.0 !!

Changes in this version :

  • public class org.finj.FTPClient : MODIFIED
    supports org.finj.FTPReply's internationalization,
    setPassive() now returns byte[],
    getFile(String) changed to getFile(OutputStream,String)
  • public interface org.finj.FTPServerParser : MODIFIED
    was an abstract class that collided with the 'factory' pattern.
  • public class org.finj.FTPServerParserFactory : CREATED
    see above.
  • public interface org.finj.FTPClientObserver : MODIFIED
    dataReceived(int) and dataSent(int) where 'un-deprecated'... they finally might make sense.
  • public class org.finj.FTPException : MODIFIED
    now extends java.lang.RuntimeException instead of java.lang.Exception.

Sorry for the delay, I changed work position... and took some days off.

Many thanks to people that downloaded draft versions of API... I'm the first one surprised that it has been of any interest to anyone but me ;)

Implementation of org.finj.FTPClient is going on. I added a small tool to this site, the PROJECT-O-METER that gives you a precise idea of the status of the work undertaken.

        -- javier

> 2000-10-19 : released

I already mentioned (00-09-04) that finj was going to be internationalizable. Well, right now, only one file ( is internationalizable, but it would be nice that people started translating those messages in their languages.

Get this zipped file : there are only 40 sentences to translate !! and send translation back to me.

Many thanks in advance.

        -- javier

> 2000-10-19 : finj-api_draft3.tar.gz is useless

Many thanks to Magnus Rosenquist who sent me an email commenting that he could not gunzip finj-api_draft3.tar.gz after downloading it. Yep... something happened while preparing that file.

A working version of this api is available online under the name of finj-api_draft3b.tar.gz

Sorry for people who downloaded the useless file.

        -- javier

> 2000-10-19 : IMPORTANT NOTE

Hi all,

First of all : many thanks to people that sent comments/requests and downloaded draft versions of API... it's good to know that this project has some echo out there :)

Then : sorry to be that late on releases. Really. But now I'm afraid to admit that


ok. I wrote it. I'm running out of time... so I released today (2000-11-24) the first very, very draft version of the java source code I was working on. It's pretty ugly, with lot of debugging stuff everywhere.

Have a look at :
-> project-o-meter
to see what's already implemented/works.

Now, send your feedback !! are you still interested in this project ? if it's the case, you're welcome. There's not too much work to do, but I can't find enough time in a straight to work well enough on it.

I hope we'll find a solution, all together !

        -- javier

> 2000-09-23 : Draft-3 version of API

Changes in this version :

  • public class org.finj.FTPClient : MODIFIED
    more support for observer.
  • public class org.finj.FTPClientObserver : MODIFIED
    more things might be observed, dataSent(int) and dataReceived(int) are deprecated (makes no sens, as org.finj.FTPClient doesn't take care of reading and writing to the data connection).
  • public class org.finj.FTPClientAdapter implements org.finj.FTPClientObserver : CREATED
    an implementation of org.finj.FTPClientObserver that does strictly nothing, but that can easily be extended.

I started implementing org.finj.FTPClient... works well. Almost all methods working on control connection are implemented. Soon data connections will be available. Nevertheless, I don't think it's time to release code yet. Do you think I'm wrong ?

        -- javier

> 2000-09-04 : Draft-2 version of API

Sorry : I've been off some days. That's why nothing happened since 2 weeks.

Many thanks to people that commented the previous (draft-1) version of API.

Changes in this version are :

  • public interface org.finj.FTPReplyListener : REMOVED
    replaced by org.finj.FTPClientObserver.
  • public interface org.finj.FTPClientObserver : CREATED
    replaces org.finj.FTPReplyListener and adds methods to monitor data transfer.
  • public class org.finj.FTPRemoteFile : CREATED
    implements org.finj.RemoteFile.
  • public abstract class org.finj.FTPServerParser : CREATED
    added to support different kind of FTP server plateform-specific syntaxes.
    Note that the interface is not defined yet, but support for different plateforms will be required e.g., to parse the dir command results.
    Developers using finj will not have to deal directly with this class and it's descendent anyway...
  • public class org.finj.DOSFTPServerParser : CREATED
    implements org.finj.FTPServerParser for FTP servers running on DOS plateform.
  • public class org.finj.UnixFTPServerParser : CREATED
    implements org.finj.FTPServerParser for FTP servers running on Unix plateform.
  • public class org.finj.VMSFTPServerParser : CREATED
    implements org.finj.FTPServerParser for FTP servers running on VMS plateform.
  • public class org.finj.FTPClient : MODIFIED
    methods to handle ONE org.finj.FTPClientObserver per instance (see API).
  • public class org.finj.FTPReply : MODIFIED
    supports internationalization of FTP error message details through use of java.util.ResourceBundle org.finj.FTPMessage[_$LOCAL$].properties files. Default locale is US, but I could prepare FR and ES.
    Does anyone want to contribute to internationalization effort (ca. 40 sentences) ?

Some of those changes result from comments, others where just predicted, but not yet written down.

        -- javier

> 2000-08-21 : Draft version of API

This is the first public version of the API. Of course : it is open to comments !

Let say that these document is the most important part of the project : we are going to sign a pact between us, and the 'users' of the package. Take time to read it carefully and please : suggest, criticize, comment, complain, yell out... whatever, but REACT !

Note that deprecated versions of the methods are present. This way, interrested developers have a fast and easy way to test finj : replacing new constructor with a new org.finj.FTPClient, the rest should work the same. BUT, finj is aimed at replacing sun's FtpClient, in order to take advantage of it's pluses.

        -- javier

> 2000-08-14 : Welcome !

Well... here we go.

This is the finj project home page, where we are going to develop a better, open-source replacement for the programmatically controllable FTP client from sun microsystems.

The FTP protocol, as defined in the RFC959 (October 1985), is a rich protocol that allows to transfer and, in a smaller extend, manage a remote file system through a client-server architecture.

Sun's is a FTP client partial implementation that is provided in the standard developers' kit and runtime environnements in order to manage ftp:// URLs. The most important commands are there, but interesting ones are missing. Over all, the actual answers coming from the server are invisible from the developers classes.

Finally, as sun's FtpClient is not part of the java.* packages, it's source code is not available.

Those are the reasons why we decided to start this project !

Currently, I have a home-made Java FTP client running, that was developed for the purpose of the project in which I'm involved. It will provide the base ideas for the finj implementation.

        -- javier

forged on     written with     tested using
SourceForge Logo   JUnit logo   JUnit logo

project admin