2013-03-15 37 views
7

Tôi đang sử dụng apache util để sao chép một tập tin vào một thư mục bằng cách sử dụng fileutil.copyFile(src, dest)file sao chép sử dụng apache fileutil.copyfile

Các tập tin tôi sao chép được cập nhật mỗi 2 giây bởi một nhà cung cấp bên ngoài và tôi thực sự không muốn khóa nó (ứng dụng của tôi đang chạy trong windows- điều này sẽ gây ra tất cả các loại vấn đề). Tôi hy vọng một người nào đó có thể giúp tôi trong việc tư vấn cách an toàn nhất để sao chép hoặc thậm chí đọc một tệp mà không có tệp nguồn bị khóa là gì?

Trân trọng

+2

Đây có phải là ứng dụng chỉ dành cho Windows không? Và bạn có đang chạy Windows Server không? Nếu vậy bạn có thể muốn xem xét thành phần sao chép tệp của DFS dưới dạng * rất * khả thi thay thế cho những gì bạn đang cố gắng làm bây giờ. – Perception

+0

Nhà cung cấp bên ngoài có thay đổi trực tiếp tệp trong hệ thống tệp không? Hay anh ta sử dụng bất kỳ giao diện nào như webservice? – Kai

+0

trực tiếp sửa đổi tệp - cứ sau 2 giây. i chanegd từ đọc tập tin trực tiếp để sao chép đọc trực tiếp là nguy hiểm hơn. Tôi chỉ đoán – Biscuit128

Trả lời

2

Vì bạn không khóa toàn bộ tệp trước khi tác vụ sao chép, cơ chế khóa tệp mặc định của OS đang hoạt động.

Tôi chạy một chương trình thử nghiệm nhanh để xem điều gì xảy ra trên máy Windows khi bạn sao chép tệp nguồn trong khi quá trình bên ngoài đang ghi vào tệp mỗi 2 giây.

Quá trình ghi vào tệp không bao giờ gặp sự cố.

public static void main(String[] args) { 
    File f = new File("..\\test.txt"); 
    long startTime = System.currentTimeMillis(); 
    long elapsedTime = 0; 
    while (elapsedTime < 1000 * 60) { 
     try { 
      FileUtils.writeStringToFile(f, System.currentTimeMillis()+" : Data Write\r\n", true); 
      Thread.sleep(2000); 
     } catch (IOException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex){ 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     elapsedTime = System.currentTimeMillis() - startTime; 
    } 
} 

Quá trình sao chép tệp sẽ ném ngoại lệ nếu không hoàn thành bản sao trước khi tệp nguồn thay đổi độ dài. Dường như ngoại lệ này có nhiều cảnh báo rằng phiên bản tệp đã sao chép chưa hoàn tất. Khi tôi đồng bộ hóa thời gian để giữ cho đọc từ các tập tin cùng một lúc viết xảy ra ngoại lệ này đã không được ném.

public static void main(String[] args) { 
    File f = new File("..\\test.txt"); 
    long startTime = System.currentTimeMillis(); 
    long elapsedTime = 0; 
    while (elapsedTime < 1000 * 60) { 
     try { 
      FileUtils.copyFile(f, new File("..\\test\\test.txt")); 
      Thread.sleep(2000); 
     } catch (IOException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex){ 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     elapsedTime = System.currentTimeMillis() - startTime; 
    } 
} 

Dựa trên thử nghiệm này, tôi sẽ không lo lắng về những gì xảy ra với quy trình viết. Tôi sẽ làm một cái gì đó để xử lý các trường hợp khi java.io.IOException: Failed to copy full contents from '..\test.txt' to '..\test\test.txt' được ném.

1

Đây là trích đoạn từ How to Cache a File in Java, bạn có thể tìm thấy thêm ở đó.

Caching tập tin trong Java


Đọc tập tin từ đĩa có thể được làm chậm, đặc biệt là khi một ứng dụng đọc các tập tin tương tự nhiều lần. Caching giải quyết vấn đề này bằng cách giữ các tập tin thường xuyên truy cập trong bộ nhớ. Điều này cho phép ứng dụng đọc nội dung từ bộ nhớ cục bộ nhanh thay vì ổ cứng chậm.Thiết kế cho bộ nhớ đệm một tập tin trong Java bao gồm ba yếu tố:

  1. Một thuật toán cho bộ nhớ đệm tập tin
  2. Một cấu trúc dữ liệu để tổ chức các nội dung cache
  3. Một API bộ nhớ cache để lưu trữ các file cache

Thuật toán để lưu tập tin


Một thuật toán chung của bộ nhớ đệm một tập tin phải chiếm sửa đổi tập tin và bao gồm các bước sau:

  1. Nhận một giá trị từ bộ nhớ cache sử dụng một đường dẫn tập tin đầy đủ như một chìa khóa .
  2. Nếu không tìm thấy khóa, hãy đọc nội dung tệp và đặt nó vào bộ nhớ cache .
  3. Nếu tìm thấy khóa, hãy kiểm tra xem dấu thời gian của nội dung được lưu trong bộ nhớ cache có khớp với dấu thời gian của tệp hay không.
  4. Nếu dấu thời gian bằng nhau, hãy trả về nội dung được lưu trong bộ nhớ cache.
  5. Nếu dấu thời gian không bằng nhau, hãy làm mới bộ nhớ cache bằng cách đọc tệp và đưa nó vào bộ nhớ cache.
Các vấn đề liên quan