2010-09-28 39 views
5

Tôi cần phải sao chép tệp văn bản từ máy chủ này sang máy chủ khác (cả hai máy chủ là Linux). Làm cách nào để làm điều đó trong Java?Sao chép tệp từ một máy chủ sang một máy chủ khác

+0

loại máy chủ? , có thể máy chủ B truy cập máy chủ của A tập tin bằng cách sử dụng HTTP? –

+1

Bạn có thể sử dụng FTP không?Các máy chủ của bạn có cùng mạng không? Bạn có đang sử dụng Hệ thống tệp được chia sẻ không? Bạn có thể triển khai Servlet không? Tôi nghĩ chúng ta cần thêm nền tảng để trả lời. –

+0

Bạn * có thể * sử dụng [scp] (http://www.go2linux.org/scp-linux-command-line-copy-files-over-ssh), nhưng tôi đoán bạn đã tự mình thực hiện nó, phải không? – Patrick

Trả lời

3

easist nếu bạn có thể sử dụng apache commons-io: lớp FileUtils có phương pháp thuận tiện để sao chép các tập tin:

FileUtils.copyFileToDirectory(srcFile, targetDirectory); 

(như bạn nói về văn bản file tôi giả sử, ứng dụng của bạn có quyền truy cập vào cả hai tập tin hệ thống)

+0

Yêu cầu máy chủ A có thư mục máy chủ B được gắn cục bộ không? – aioobe

+1

Đoán như vậy. Câu hỏi có phần mơ hồ - thường bạn có một giao diện nhất định (hệ thống tệp, ftp, webservice, ...) và tìm kiếm trợ giúp để triển khai/sử dụng nó với ngôn ngữ lập trình nhất định (ở đây: Java) ... –

+0

Câu trả lời hay (+1) –

3

Nếu bạn cần sao chép tệp từ hệ thống tệp có thể truy cập, hãy truy cập Andreas' answer.

Nếu bạn muốn có cách tiếp cận chung tóm tắt từ giao thức bên dưới, hãy xem Apache Commons VFS. Nó cung cấp một api phổ biến đối với các nguồn lực có sẵn thông qua a number of protocols:

  • FTP
  • tập tin địa phương
  • HTTP và HTTPS
  • SFTP
  • Temporary Files
  • Zip, Jar và Tar (không nén, tgz hoặc tbz2)
  • gzip và bzip2
  • res
  • ram
  • kịch câm
0

Hầu như tất cả các máy Linux sẽ có máy chủ SSH chạy theo mặc định. Vì vậy, SCP sẽ là đặt cược tốt nhất của bạn để sao chép các tập tin giữa chúng.

Sử dụng thư viện SSH như JSCH để thực hiện việc này. Bạn sẽ tìm thấy một hướng dẫn để thực hiện chuyển SCP bằng cách sử dụng JSCH here.

1

Nếu bạn sử dụng FTP, bạn có thể sử dụng FTPClient từ giao thức Apache/net.

Dưới đây là một số mã mẫu để bạn tham khảo:


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

Nếu bạn muốn một cách dễ dàng và máy chủ của bạn hỗ trợ PHP, tôi khuyên bạn nên Rapid Transfer Script.

Chỉ cần tải tập lệnh lên thư mục bạn muốn sao chép tệp, nhập URL của tệp bạn muốn sao chép và nhấp vào Chuyển. Nó sao chép một tập tin 1.4GB trên dưới 2 phút và lưu lại cho tôi rất nhiều thời gian và băng thông.

0

Tôi đã sử dụng mạng lưới commons net FTP để chuyển tệp từ máy chủ này sang máy chủ khác.

Maven phụ thuộc:

<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); 
      } 
     } 

    } 
+0

Bạn kết nối với máy chủ khác ở đâu? Bởi vì tôi chỉ thấy một FTPClient kết nối. Bạn có thể giải thích được không? – Sibtain

+0

Sibtain Xin chào, servername là tên máy chủ hoặc IP của bạn và cổng sẽ là cổng FTP của bạn chạy trên máy chủ và tên người dùng/mật khẩu để kết nối với máy chủ. – ravi

Các vấn đề liên quan