简体   繁体   English

使用java将文件从unix传输到windows

[英]transfer files from unix to windows using java

I want to get a file from unix system to my local system which is on windows using java. 我想从unix系统获取一个文件到我的本地系统,这是在Windows上使用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? 哪个是最适合此任务的Java API?

If the Unix machine supports SFTP, JSch is an option. 如果Unix机器支持SFTP,则JSch是一个选项。 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);
    }
  }
}

I have found JSch to be very useful and straight foreword. 我发现JSch非常有用且直截了当。 Below is a snippet of code written to put all .txt files in a given folder on the sftp server. 下面是一段代码,用于将所有.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); }
    } );
}

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

There are multiple choices to do that. 有多种选择。 First one simple socket communication between a java client and a server. 首先是java客户端和服务器之间的简单套接字通信。 If you want to go with this approach then follow this: 如果您想采用这种方法,请遵循以下步骤:

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

Then there are other high level protocols implementations that can be used such as FTP, HTTP, etc 然后还有其他高级协议实现可以使用,如FTP,HTTP等

Follow a related SO post for java FTP client server: FTP client server model for file transfer in Java 关注java FTP客户端服务器的相关SO帖子:用于Java 中文件传输的FTP客户端服务器模型

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM