2011-09-25 27 views
5

Tôi đã thực hiện một chương trình Java trong Eclipse. Tôi đã bắt đầu trên Windows XP, nhưng gần đây đã được nâng cấp.Tại sao chương trình của tôi không thể xóa các tệp mà nó tạo ra trong Win7?

Là một phần của cơ chế tiết kiệm, chương trình ghi cài đặt vào tệp settings_new.sav. Nếu điều đó ổn, nó sẽ xóa settings.sav và đổi tên tên mới để khớp với tên cũ. Trong khi nó làm việc theo winXP (ít nhất là tôi nghĩ nó đã làm, nhưng tôi không thể kiểm tra bây giờ), theo win7, nó không xóa các tập tin, mặc dù nó là chương trình tạo ra nó (mặc dù, một ví dụ khác của chương trình).

Tệp được chọn bởi Eclipse và có thể bị xóa khỏi đó một cách khá vui vẻ. Tôi có thể xóa nó bằng tay. Tôi là quản trị viên trên máy tính của riêng tôi. Thư mục nằm ngay bên trong thư mục không gian làm việc và không nằm trong Program Files (tuy nhiên, tôi không biết liệu người dùng cuối cùng sẽ cài đặt nó ở đó). Chương trình có thể tạo và sửa đổi các tập tin tốt. Nó không ném bất kỳ ngoại lệ nào, mà tôi nghĩ nó sẽ xảy ra nếu nó là win7 chặn nó.

Bất kỳ ý tưởng nào?

Trả lời

9

Đó là do cơ chế khóa tệp trong java.Đảm bảo bạn đóng các luồng đệm như BufferedReader, BufferedInputStream trên tệp đó khi hoàn tất.

+0

Nó thực sự là cơ chế khóa tệp trong Windows. Mã tương tự có thể hoạt động tốt trong Linux. Nhưng tôi đồng ý, bạn nên đóng quyền truy cập một cách rõ ràng vào tệp để làm cho tệp hoạt động bình thường ở mọi nơi. –

+0

@MarkRobinson: Thú vị, tôi nên kiểm tra các ứng dụng swing của tôi trong linux too.It dường như các nhà phát triển nên dự đoán các vấn đề ở cấp hệ điều hành hơn là trên JVM. – PraveenMax

+1

Windows và Linux có các ngữ nghĩa khóa tập tin khác nhau. Linux sẽ cho phép bạn xóa một tệp bạn đã mở để chỉnh sửa mà không cần phải thổi lên. Sau đó, bạn có thể tạo tệp mới có cùng tên mà không gặp sự cố. Trong Windows, nó có thể ngăn bạn xóa một tập tin nếu nó được mở trong một tiến trình khác. Các tình huống cụ thể này xảy ra phụ thuộc rất lớn vào cách nó được mở (theo phương thức/và kiểu truy cập). Nếu bạn có thêm câu hỏi, tôi đề nghị bạn đăng một câu hỏi SO mới nhằm vào các nhân viên Windows :) –

-3

Tôi từng gặp vấn đề này, khi bạn sử dụng xong tệp của mình, bạn phải đặt tệp của mình bằng null. Vì vậy, nếu bạn làm điều gì đó như:

public void createFile(String path) 
{ 
    File file = new File(path); 
    file.createNewFile(); 
    file = null 
} 

bạn phải đặt tệp thành rỗng khi bạn sử dụng xong để hệ thống ngừng sử dụng tệp đó. bạn phải làm điều tương tự với FileReader và FileWriter. bạn phải đặt trình đọc tệp của bạn và các tác giả tệp của bạn thành null để truy cập lại tệp. Hãy thử và cho tôi biết nó như thế nào.

+2

Điều đó sẽ không hoạt động. Tất cả những gì sẽ làm là cho phép bộ thu gom rác Java nhặt nó lên sau. Sau đó là không xác định. Bạn nên đóng quyền truy cập một cách rõ ràng vào tệp thay vì đợi bộ thu gom rác để lấy nó. –

+0

thats những gì thiết lập nó để null hiện, khi bạn thiết lập một cái gì đó để trống java rác tự động thu thập. – gsfd

+2

Nó có nghĩa là nó có sẵn cho bộ sưu tập, không phải là bộ sưu tập xảy ra ngay lập tức. Nó có thể, nhưng nó là hành vi đặc biệt của JVM. –

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