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.
Đâ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
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
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