2013-08-03 38 views
7

我想从unix系统获取文件到本地系统,该文件位于使用java的窗口上。我对这个概念非常陌生。关于如何完成的任何想法?哪个是最适合这项任务的Java API?使用java将文件从Unix传输到Windows

+0

你能解释为什么你想特别使用Java吗? Samba或SFTP正在运行,可以立即安装的选项已经可以做到这一点。 – chrylis

回答

4

我发现JSch是非常有用的直序。以下是为了将所有.txt文件放在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

非常感谢 – user1585111

2

我想到的第一件事就是FTP。

+1

但FTP不安全的权利,我认为这将是一件好事,如果我们继续与SFTP。 – user1585111

2

有多种选择可以做到这一点。首先在java客户端和服务器之间进行一个简单的套接字通信。如果你想要去使用这种方法,然后按照此:

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

还有一些可以使用的,例如FTP,HTTP等其他高层次的协议实现

遵循相关的SO张贴java FTP客户端服务器:FTP client server model for file transfer in Java

+0

谢谢,有一些很好的信息..有没有Java API让这些事情很简单? – user1585111

+0

@ user1585111 java apis可用并广泛用于套接字通信。检查这个:http://download.oracle.com/javase/tutorial/networking/sockets/ –

+0

可以帮助我实现这个任务? – user1585111

9

如果Unix机器支持SFTP,则可以使用JSch。你能适应下面的代码,以满足您的需求:

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

非常感谢你 – user1585111

+0

很好地使用和非常优雅的方法。 –

+0

channelSftp.get(“/ remotepath/remotefile.txt”,“/localpath/localfile.txt”);特别有帮助 – parishodak

相关问题