2013-08-03 15 views
7

私はUNIXシステムからJavaを使用しているWindows上のローカルシステムにファイルを取得したいと思います。私はこのコンセプトに非常に新しいです。どのようにそれを行うことができるかに関する任意のアイデア?このタスクのための最高の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

jschはこのタスクを達成するのに役立ちますか? – 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

関連する問題