Search code examples
javaapacheftpclient-serverftp-client

Copy the dynamically incrementing log file data from FTP to local


I need to copy and paste dynamically incrementing log file data from FTP Server to local drive.

The below program I used can only do the copying one time. And not in the incremental manner.

public class ReadFtpFile {

    public static void main(String[] args) throws UnknownHostException {

    String server = "myIP";
    int port = 20;
    String user = "username";
    String pass = "password";

    FTPClient ftpClient = new FTPClient();
    try {

        ftpClient.connect(server, port);
        ftpClient.login(user, pass);
        ftpClient.enterLocalPassiveMode();
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        // APPROACH #2: using InputStream retrieveFileStream(String)
        String remoteFile2 = "/folder/myfile.log";
        File downloadFile2 = new File("F:/myfolder/mylogfile.log");
        OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2));
        InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
        byte[] bytesArray = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(bytesArray)) != -1) {
        outputStream2.write(bytesArray, 0, bytesRead);
        }

        Boolean success = ftpClient.completePendingCommand();
        if (success) {
        System.out.println("File #2 has been downloaded successfully.");
        }
        outputStream2.close();
        inputStream.close();

    } catch (IOException ex) {
        System.out.println("Error: " + ex.getMessage());
        ex.printStackTrace();
    } finally {
        try {
        if (ftpClient.isConnected()) {
            ftpClient.logout();
            ftpClient.disconnect();
        }
        } catch (IOException ex) {
        ex.printStackTrace();
        }
    }
    }

}

The log file data in the FTP server is growing for every second.I need to update the local file with new data in the FTP.


Solution

  • Replace the lines

    OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2));
    InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
    

    with

    ftpClient.setRestartOffset(downloadFile2.length());
    InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
    OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2, true));
    

    This will check if the file already exists and, if so, download only the new data. If you need to do this periodically, add a loop around the whole try-catch block.