transfer files from unix to windows using java

user1585111 picture user1585111 · Aug 3, 2013 · Viewed 20.5k times · Source

I want to get a file from unix system to my local system which is on windows using java. I'm very much new to this concept. Any ideas on how it could be done? Which is the best java API for this task?

Answer

laz picture laz · Aug 3, 2013

If the Unix machine supports SFTP, JSch is an option. You could adapt the following code to meet your needs:

private static final String USER_PROMPT = "Enter username@hostname:port";
private static final boolean USE_GUI = true;

public static void main(final String[] arg) {
  Session session = null;
  ChannelSftp channelSftp = null;
  try {
    final JSch jsch = new JSch();

    final String defaultInput = System.getProperty("user.name") + "@localhost:22";
    String input = (USE_GUI) ? JOptionPane.showInputDialog(USER_PROMPT, defaultInput) : System.console().readLine("%s (%s): ", USER_PROMPT, defaultInput);
    if (input == null || input.trim().length() == 0) {
      input = defaultInput;
    }
    final int indexOfAt = input.indexOf('@');
    final int indexOfColon = input.indexOf(':');
    final String user = input.substring(0, indexOfAt);
    final String host = input.substring(indexOfAt + 1, indexOfColon);
    final int port = Integer.parseInt(input.substring(indexOfColon + 1));

    jsch.setKnownHosts("/path/to/known_hosts");
    // if you have set up authorized_keys on the server, using that identitiy
    // with the code on the next line allows for password-free, trusted connections
    // jsch.addIdentity("/path/to/id_rsa", "id_rsa_password");

    session = jsch.getSession(user, host, 22);

    final UserInfo ui = new MyUserInfo();
    session.setUserInfo(ui);
    session.connect();
    channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    channelSftp.get("/remotepath/remotefile.txt", "/localpath/localfile.txt");
  } finally {
    if (channelSftp != null) {
      channelSftp.exit();
    }
    if (session != null) {
      session.disconnect();
    } 
  }
}

public static class MyUserInfo implements UserInfo {
  private String password;

  @Override
  public String getPassword() {
    return password;
  }

  @Override
  public boolean promptYesNo(final String str) {
    final Object[] options = {"yes", "no"};
    final boolean yesNo = (USE_GUI) ? JOptionPane.showOptionDialog(null, str, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]) == 0 : System.console().readLine("Enter y or n: ").equals("y");
    return yesNo;
  }

  @Override
  public String getPassphrase() {
    return null;
  }

  @Override
  public boolean promptPassphrase(final String message) {
    return true;
  }

  @Override
  public boolean promptPassword(final String message) {
    if (!USE_GUI) {
      password = new String(System.console().readPassword("Password: "));
      return true;
    } else {
      final JTextField passwordField = new JPasswordField(20);
      final Object[] ob = {passwordField};
      final int result = JOptionPane.showConfirmDialog(null, ob, message, JOptionPane.OK_CANCEL_OPTION);
      if (result == JOptionPane.OK_OPTION) {
        password = passwordField.getText();
        return true;
      } else {
        return false;
      }
    }
  }

  @Override
  public void showMessage(final String message) {
    if (!USE_GUI) {
      System.console().printf(message);
    } else {
      JOptionPane.showMessageDialog(null, message);
    }
  }
}