Transfer files from unix to windows using java

I want to get a file from a unix system to my local system, which is on windows using java. I am very new to this concept. Any ideas on how to do this? What is the best java API for this task?

+7
java windows unix jsch
source share
4 answers

I found JSch to be a very useful and direct introduction. The following is a snippet of code written to host all .txt files in a given folder on an sftp server.

public static void sftpConnection() { // Object Declaration. JSch jsch = new JSch(); Session session = null; Channel channel = null; // Variable Declaration. String user = "foo"; String host = "10.9.8.7"; Integer port = 22; String password = "test123"; String watchFolder = "\\localhost\textfiles"; String outputDir = "/remote/textFolder/"; String filemask = "*.txt"; try { session = jsch.getSession(user, host, port); /* * StrictHostKeyChecking Indicates what to do if the server host * key changed or the server is unknown. One of yes (refuse connection), * ask (ask the user whether to add/change the key) and no * (always insert the new key). */ session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); channel = session.openChannel("sftp"); channel.connect(); ChannelSftp sftpChannel = (ChannelSftp)channel; // Go through watch folder looking for files. File[] files = findFile(watchFolder, filemask); for(File file : files) { // Upload file. putFile(file, sftpChannel, outputDir); } } finally { sftpChannel.exit(); session.disconnect(); } } public static void putFile(File file, ChannelSftp sftpChannel, String outputDir) { FileInputStream fis = null; try { // Change to output directory. sftpChannel.cd(outputDir); // Upload file. fis = new FileInputStream(file); sftpChannel.put(fis, file.getName()); fis.close(); } catch{} } public static File[] findFile(String dirName, final String mask) { File dir = new File(dirName); return dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String filename) { return filename.endsWith(mask); } } ); } 
+4
source share

If the Unix machine supports SFTP, JSch is an option. You can adapt the following code to suit 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); } } } 
+9
source share

The first thing that comes to my mind is FTP.

+2
source share

There are several options to do this. The first simple socket connection between a java client and a server. If you want to go with this approach, follow these steps:

http://mrbool.com/file-transfer-between-2-computers-with-java/24516

Then there are other implementations of high-level protocols that can be used, such as FTP, HTTP, etc.

Follow the related SO messages for the java server of the FTP client: FTP client server model for transferring files in Java

+2
source share

All Articles