2013-08-03 13 views
7

Voglio ottenere un file dal sistema unix al mio sistema locale che è su Windows usando java. Sono molto nuovo a questo concetto. Qualche idea su come potrebbe essere fatto? Qual è la migliore API java per questa attività?trasferire i file da unix a windows usando java

+0

Potete spiegare perché si desidera utilizzare in modo specifico Java? Samba o SFTP funzionano, opzioni pronte per l'installazione che già lo fanno. – chrylis

risposta

4

ho trovato JSch per essere molto utile e prefazione dritto. Di seguito è riportato uno snippet di codice scritto per mettere tutti i file .txt in una data cartella sul server sftp.

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's 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); } 
    }); 
} 
+1

Grazie mille – user1585111

2

La prima cosa che mi viene in mente è FTP.

+1

ma FTP non è sicuro, penso che andrebbe bene se continuiamo con sftp. – user1585111

2

Ci sono diverse opzioni per farlo. Prima una semplice comunicazione socket tra un client java e un server. Se si vuole andare con questo approccio quindi seguire questo:

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

Poi ci sono altri protocolli di alto livello implementazioni che possono essere utilizzati come FTP, HTTP, ecc

seguire un correlate, al fine postare per server client FTP java: FTP client server model for file transfer in Java

+0

grazie, hai delle buone informazioni ... c'è qualche java api per rendere queste cose abbastanza semplici? – user1585111

+0

@ user1585111 java apis sono disponibili e ampiamente utilizzati per la comunicazione socket. controllare questo: http://download.oracle.com/javase/tutorial/networking/sockets/ –

+0

jsch può aiutarmi a raggiungere questo compito? – user1585111

9

Se la macchina Unix supporta SFTP, JSch è un'opzione. Si potrebbe adattare il seguente codice per soddisfare le vostre esigenze:

private static final String USER_PROMPT = "Enter [email protected]: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); 
    } 
    } 
} 
+0

Grazie mille – user1585111

+0

Approccio ben utilizzato e molto elegante. –

+0

channelSftp.get ("/ remotepath/remotefile.txt", "/localpath/localfile.txt"); è particolarmente utile – parishodak