2011-10-29 40 views
5

Tôi đã viết một ứng dụng Android giúp lưu các tệp lớn (có khả năng) vào Thẻ SD. Thỉnh thoảng tôi nhận được một IOException trong quá trình ghi mà làm cho tập tin bị bỏ lại trong trạng thái hỏng. Dựa trên câu trả lời cho câu hỏi này:Làm thế nào để lưu tệp vào đĩa một cách an toàn trong Android?

Question: How to safely write to a file?

chiến lược tôi nên sử dụng là tạo ra một tập tin tạm thời và sau đó sao chép tập tin này khi ghi đã hoàn thành. Câu hỏi của tôi là:

1) Đây có phải là cách tiếp cận an toàn nhất trên Android không? (ví dụ: Bạn có thể sao chép tệp trên thẻ sd android và nếu đó là hoạt động nguyên tử?)

2) Trong một hệ thống nhúng có giới hạn tài nguyên (không gian đĩa) có ai biết chiến lược khác để ghi một cách an toàn vào đĩa không? (Thay vì tạo hai tập tin lớn)

Cảm ơn

+0

Xin lỗi, tôi đã hiểu nhầm câu hỏi của bạn. Tôi đã xóa câu trả lời của mình. –

Trả lời

10

Cách điển hình để tạo ra một tập tin trên hầu hết các nền tảng hợp lý một cách an toàn (Linux/Android một trong số họ) là tạo ra một tập tin tạm thời và sau đó đổi tên tệp, như được đề cập trong câu hỏi & câu trả lời mà bạn đã liên kết. Lưu ý sự nhấn mạnh vào số đổi tên; đổi tên tệp là thường là hoạt động nguyên tử trong cùng hệ thống tệp, sao chép một tệp không phải là. Ngoài ra, phương pháp này chỉ yêu cầu đủ không gian cho một bản sao dữ liệu.

Vì vậy, bạn tạo tệp trong thư mục đích bằng tên tạm thời và sau đó sử dụng File.renameTo() để đặt tên phù hợp. Bằng cách sử dụng quy ước đặt tên chuẩn cho các tệp tạm thời, bạn luôn có thể tìm và xóa chúng, ngay cả khi ứng dụng của bạn chấm dứt đột ngột do ví dụ: một thiết bị tắt nguồn.

Nếu bạn đang thực sự hoang tưởng, bạn có thể muốn chèn một vài cuộc gọi đến FileDescriptor.sync() hoặc tương đương ...

EDIT:

BTW, bạn không đề cập gì loại IOException bạn đang nhận được và liệu bạn đã theo dõi nguyên nhân của nó. Nếu nó là do không đủ không gian, tốt, nhưng nếu chúng ta đang nói về một thẻ SD bị lỗi, sau đó không có những điều như "an toàn" trong trường hợp này.

EDIT 2:

Để kiểm tra dung lượng trống có sẵn, bạn có thể tạo một đối tượng File cho thư mục đích (ví dụ: thư mục tập tin của bạn sẽ kết thúc) và gọi File.getFreeSpace(). Lưu ý rằng séc này không cung cấp bất kỳ đảm bảo nào - bạn vẫn có thể kết thúc mà không có đủ dung lượng nếu ví dụ: quá trình khác ghi dữ liệu vào phương tiện.

+0

Cảm ơn câu trả lời rõ ràng. Đổi tên có ý nghĩa rất nhiều, tôi đã bỏ lỡ điều đó trong câu hỏi khác. – brif

+0

Đổi tên âm thanh chắc chắn như câu trả lời. Tuy nhiên tôi đã tự hỏi bạn có thể kiểm tra xem bạn có đủ không gian trống trên SD cho tệp bạn đang chuẩn bị viết không? – Jeff

+0

@ Jeff: bạn có thể gọi ['File.getFreeSpace()'] (http://developer.android.com/reference/java/io/File.html#getFreeSpace%28%29) để tránh các trường hợp rõ ràng hơn của không đủ không gian. – thkala

0

Tôi không biết mình có muốn sao chép hay không, nhưng đổi tên tệp tạm thời là điển hình. Nếu bạn nhận được một ngoại lệ trong khi viết, chỉ cần xóa tệp tạm thời.

3

Tôi biết điều này là quá muộn để trả lời, nhưng sẽ giúp bất kỳ ai gặp phải vấn đề này sẽ thấy hữu ích.

Bạn cần sử dụng AtomicFile.

Đoạn mã sau có thể hữu ích.

private void writeFile(File file, byte[] data) { 
    file.mkdirs(); 
    try { 
     AtomicFile aFile = new AtomicFile(file); 
     FileOutputStream fos = aFile.startWrite(); 
     fos.write(data); 
     aFile.finishWrite(fos); 
    } catch (IOException ioe) { 
     Log.e(TAG, "Cannot write file " + file.getPath()); 
    } 
} 
Các vấn đề liên quan