2010-10-23 37 views
16

Cách nhanh nhất để sao chép một số lượng lớn tệp trong Java là gì. Cho đến nay tôi đã sử dụng các luồng tệp và nio. Các luồng tổng thể dường như nhanh hơn nio. Bạn đã làm gì cho đến nay?Cách nhanh nhất để sao chép các tệp trong Java

+2

Bạn đang thực hiện một số loại chuyển đổi trên các tệp khi bạn sao chép chúng? Tại sao không chỉ sử dụng các chức năng hệ thống tập tin của hệ điều hành? –

+0

Không, tôi không thực hiện bất kỳ phép chuyển đổi nào. Nhưng việc xử lý lỗi sẽ khó khăn hơn nhiều khi sao chép hơn 10,000 tệp và chi phí tạo ra một chuỗi hệ thống khi sao chép các tệp nhỏ là lớn. – Mato

+0

Tôi khuyên bạn nên sửa đổi câu hỏi của mình để bao gồm các ràng buộc mà chúng tôi đã phát hiện ra. –

Trả lời

19

http://www.baptiste-wicht.com/2010/08/file-copy-in-java-benchmark/ có thể giúp bạn có được câu trả lời của bạn.

Đối với điểm chuẩn, tôi đã thực hiện các thử nghiệm bằng cách sử dụng các tệp khác nhau.

  1. nhỏ tập tin (5 KB)
  2. tập trung (50 KB)
  3. Big tập tin (5 MB)
  4. tập tin Fat (50 MB)
  5. Và một tập tin rất lớn (1,3 GB) chỉ nhị phân

Và trước tiên tôi đã thực hiện các thử nghiệm bằng cách sử dụng tệp văn bản và sau đó sử dụng tệp nhị phân. Tôi đã thực hiện các thử nghiệm bằng ba chế độ:

  1. Trên cùng một đĩa cứng. Đó là một đĩa cứng IDE có dung lượng 250 GB với bộ nhớ cache 8 MB. Nó được định dạng trong Ext4.
  2. Giữa hai đĩa. Tôi đã sử dụng đĩa đầu tiên và một đĩa cứng SATA khác có dung lượng 250 GB với bộ nhớ cache 16 MB. Nó được định dạng trong Ext4.
  3. Giữa hai đĩa. Tôi đã sử dụng đĩa đầu tiên và một đĩa cứng SATA khác có dung lượng 1 TB với bộ nhớ cache 32 MB. Nó được định dạng bằng NTFS.

Tôi đã sử dụng khung chuẩn, described here, để thực hiện kiểm tra tất cả các phương pháp. Các bài kiểm tra đã được thực hiện trên máy tính cá nhân của tôi (Ubuntu 10.04 64 bit, Intel Core 2 Duo 3.16 GHz, 6 Go DDR2, SATA Hard Disk). Phiên bản Java sử dụng là một Java 7 64 bit Virtual Machine ...

+1

cảm ơn, câu trả lời này cho câu hỏi của tôi – Mato

1

Có ngã ba java trên tập lệnh batch của hệ điều hành sao chép tệp. Mã của bạn có thể phải viết tập lệnh batch.

+1

Đã nghĩ về điều đó nhưng việc xử lý lỗi sẽ khó khăn khi sao chép 10.000 tệp và chi phí sinh sản của một luồng hệ thống khi sao chép các tệp nhỏ là lớn. Hơn nữa các ứng dụng sẽ không được nền tảng độc lập. – Mato

+0

1. Bạn sẽ phải xử lý việc kiểm tra lỗi. 2. Bạn chính xác ở chỗ nó sẽ không được nền tảng độc lập - vì vậy bạn có ý định chạy trên các máy chủ của các loại khác nhau? 3. Bạn có thể tạo 10.000 tệp ở vị trí 'thích hợp' để bắt đầu và không cần một bản sao nào cả? 4. Không sinh ra một luồng cho mỗi tập tin. Một chủ đề cho mỗi 100 tệp hoặc một cái gì đó. –

+0

Tôi đồng ý với điều này. Sao chép các tập tin câm không phải là một trường hợp sử dụng lý tưởng của Java. Nếu bạn muốn làm điều đó từ Java, sau đó ngã ba tắt một cuộc gọi cấp hệ điều hành. – bwawok

9

Tôi sẽ sử dụng:

import java.io.*; 
import java.nio.channels.*; 

public class FileUtils{ 
    public static void copyFile(File in, File out) 
     throws IOException 
    { 
     FileChannel inChannel = new 
      FileInputStream(in).getChannel(); 
     FileChannel outChannel = new 
      FileOutputStream(out).getChannel(); 
     try { 
      inChannel.transferTo(0, inChannel.size(), 
        outChannel); 
     } 
     catch (IOException e) { 
      throw e; 
     } 
     finally { 
      if (inChannel != null) inChannel.close(); 
      if (outChannel != null) outChannel.close(); 
     } 
    } 

    public static void main(String args[]) throws IOException{ 
     FileUtils.copyFile(new File(args[0]),new File(args[1])); 
    } 
} 

Nếu bất kỳ tập tin của bạn là lớn hơn 64M trong Windows bạn có thể cần phải xem xét điều này: http://forums.sun.com/thread.jspa?threadID=439695&messageID=2917510

+7

bắt (IOException e) { ném e; } <--- nice one – unbeli

+0

Đó chỉ là mã mẫu. –

+1

Cảm ơn điều này nhanh hơn rất nhiều so với những gì tôi đang sử dụng! –

1

Bạn có thể sử dụng hoặc thực hiện FileUtils của commons-io apache thư viện để sao chép tập tin

FileUtils.copyFile(new File(sourcePath), new File(destPath)); 

Trong đó sử dụng FileChannel cho IO hoạt động.

Hoặc sử dụng phương pháp java.nio.file.Files 's copy().

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