从一个服务器复制文件到另一个服务器

6

我需要将一个文本文件从一台Linux服务器复制到另一台Linux服务器。如何使用Java实现?


服务器类型是什么?服务器B能否使用HTTP访问服务器A的文件? - jmj
1
你会使用FTP吗?你的服务器在同一个网络上吗?你正在使用共享文件系统吗?你能部署Servlet吗?我认为我们需要更多的背景信息才能回答。 - Tomas Narros
可以使用scp,但我猜你想要自己实现它,是吗? - Patrick
这个问题的答案强烈依赖于您可用的传输机制。 - Thorbjørn Ravn Andersen
6个回答

6
如果您需要从可访问的文件系统中复制文件,请使用Andreas' answer
如果您想要一个通用的方法,可以抽象出底层协议,请查看Apache Commons VFS。它为通过多种协议可用的资源提供了一个公共API:
  • FTP
  • 本地文件
  • HTTP和HTTPS
  • SFTP
  • 临时文件
  • Zip、Jar和Tar(未压缩、tgz或tbz2)
  • gzip和bzip2
  • res
  • ram
  • mime

4

如果您能够使用apache commons-io,那么最简单的方法是: FileUtils类提供了方便的方法来复制文件:

FileUtils.copyFileToDirectory(srcFile, targetDirectory);

由于您提到了文本文件,我假设您的应用程序可以访问两个文件系统。


需要在服务器A上本地挂载服务器B的目录吗? - aioobe
1
猜想吧。这个问题有点模糊 - 通常你有一个给定的接口(文件系统、ftp、webservice等),并寻求用特定的编程语言(这里是Java)来实现/使用它的帮助... - Andreas Dolk

1
如果您选择使用FTP,可以使用Apache commons/net中的FTPClient。
以下是一些示例代码供您参考:

FTPClient client = new FTPClient();
client.connect(host);

if(FTPReply.isPositiveCompletion(client.getReplyCode())) {
  if(client.login(username, password)) {
    FileInputStream fis = new FileInputStream(localFilepath);

    try {
      if(client.storeFile(remoteFilename, fis)) {
        System.out.println("File uploaded!");
      }
    }
    finally {
      fis.close();
    }  
  }
}

0
我使用了Commons Net FTP来在两个服务器之间传输文件。
Maven依赖项:
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.3</version>
    </dependency>

Java:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;


    public void tranferFile() {

        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(servername, port);
            ftpClient.login(username, password);
            ftpClient.enterLocalPassiveMode();

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            File sourceFile = new File("file which you want to send");
            InputStream inputStream = new FileInputStream(sourceFile);

            boolean done = ftpClient.storeFile("filename which receiver get", inputStream);
            inputStream.close();
            if (done) {
                LOGGER.info("file is uploaded successfully..............");
            }

        } catch (IOException e) {
            LOGGER.error("Exception occured while ftp : "+e);
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                LOGGER.error("Exception occured while ftp logout/disconnect : "+e);
            }
        }

    }

你连接到另一个服务器在哪里?因为我只看到一个FTPClient连接。你能解释一下吗? - Sibtain
Sibtain您好,servername是您的主机名或IP地址,端口将是运行在服务器上的FTP端口,您需要使用用户名/密码来连接服务器。 - 2787184

0

如果您想要一种简单的方式,并且您的服务器支持PHP,我推荐使用快速传输脚本

只需将脚本上传到要复制文件的目录中,输入要复制的文件的URL,然后单击传输。它在不到2分钟的时间内跨越了一个1.4GB的文件,为我节省了大量时间和带宽。


0
几乎所有的Linux机器都会默认运行SSH服务器。因此,SCP将是在它们之间复制文件的最佳选择。
使用像JSCH这样的SSH库来完成这项任务。您可以在此处找到使用JSCH进行SCP传输的教程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接