2013-03-04 22 views
9

Tôi cố gắng để serialize các lớp sau đây:File.mkdirs() tạo ra một thư mục thay vì một tập tin

public class Library extends ArrayList<Book> implements Serializable{ 

public Library(){ 
    check(); 
} 

bằng cách sử dụng phương pháp sau đây của lớp đó:

void save() throws IOException { 
    String path = System.getProperty("user.home"); 
    File f = new File(path + "\\Documents\\CardCat\\library.ser");  

    ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream (f)); 
    oos.writeObject(this); 
    oos.close(); 
} 

Tuy nhiên, chứ không phải là tạo một tệp có tên là library.ser, chương trình đang tạo thư mục có tên library.ser không có gì trong đó. Tại sao điều này?

Nếu hữu ích của nó, save() phương pháp ban đầu được gọi là từ phương pháp này (cùng loại):

void checkFile() { 
    String path = System.getProperty("user.home"); 
    File f = new File(path + "\\Documents\\CardCat\\library.ser");  

    try {  
     if (f.exists()){ 
      load(f); 
     } 
     else if (!f.exists()){ 
      f.mkdirs(); 
      save(); 
     } 
    } catch (IOException | ClassNotFoundException ex) { 
     Logger.getLogger(Library.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Trả lời

21

File.mkdirs() tạo ra một thư mục thay vì một tập tin

Đó là những gì nó phải làm. Đọc Javadoc. Không có gì về việc tạo tệp.

f.mkdirs();

Đây là dòng tạo thư mục. Nó phải là

f.getParentFile().mkdirs(); 
+1

Và cũng 'f.createNewFile()', để tạo tệp không tồn tại. – ddmps

+1

@Pescis Điều đó hoàn toàn không cần thiết. 'FileOutputStream()' mới sẽ làm điều đó. – EJP

+0

Bạn nói đúng, 'FileNotFoundException' ném nhầm lẫn tôi. – ddmps

2

Tôi chắc chắn rằng cuộc gọi đến f.mkdirs() là vấn đề của bạn. Nếu tệp chưa tồn tại (có vẻ như trường hợp của bạn), cuộc gọi f.mkdirs() sẽ cung cấp cho bạn thư mục có tên "library.ser" thay vì Tệp, đó là lý do tại sao lệnh "save()" của bạn không hoạt động - bạn không thể tuần tự hóa một đối tượng vào một thư mục.

+0

Nói cách khác, không có ràng buộc như vậy. Tôi không thực sự hiểu câu này có liên quan gì đến nó, hoặc thực sự là ý nghĩa của nó. – EJP

+0

Điều đó có nghĩa là hệ điều hành cho phép anh ta tạo một thư mục có tên là "library.ser". Khi anh ta gọi "save()", cuối cùng anh ta cố gắng serialize vào một thư mục, điều này là không thể. – CodeBlind

+0

Điều đó có nghĩa là hạn chế bạn đề cập là tưởng tượng. – EJP

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