2013-01-30 22 views
9

Tôi hơi bối rối với một lỗi mà chương trình của tôi đã bắt đầu ném gần đây.Làm cách nào để đóng một FileInputStream gây ra lỗi "Không có dấu cách trên thiết bị"?

java.io.IOException: No space left on device 
    at java.io.FileInputStream.close0(Native Method) 
    at java.io.FileInputStream.close(FileInputStream.java:259) 
    at java.io.FilterInputStream.close(FilterInputStream.java:155) 

Tôi giả định rằng vì đây là FileInputStream, tệp này đang được lưu trữ trong bộ nhớ chứ không phải trên đĩa vật lý. Các mức bộ nhớ trông tuyệt vời và cũng như không gian đĩa. Điều này đặc biệt khó hiểu vì nó xảy ra khi đóng FileInputStream. Cảm ơn mọi lời giải thích bạn có thể có về cách điều này có thể xảy ra.

EDIT: Mã để xem xét

if (this.file.exists()) { 
      DataInputStream is = new DataInputStream(new FileInputStream(this.file)); 
      this.startDate = new DateTime(is.readLong(), this.timeZone); 
      this.endDate = new DateTime(is.readLong(), this.timeZone); 
      is.close(); 
     } 

Như bạn thấy ở trên tôi chỉ mở tập tin, đọc một số nội dung, và sau đó đóng file.

+0

tại sao không dán bạn mã? – lichengwu

+0

Đã thêm mã để làm rõ. – Judicator

+0

có thể là hệ điều hành đang ghi một số nội dung vào đĩa, nhật ký truy cập, v.v. – SpaceTrucker

Trả lời

2

Trong trường hợp này, IOException được ném từ phương pháp native đóng luồng.

Lý do được xác định để loại trừ ngoại lệ là do hoạt động close thực hiện flush cuối cùng - do đó, nếu xảy ra IOException trong quá trình xả, nó sẽ bị ném.

Có một số lý do cho sự ngoại lệ bạn đã nhận được:

  • Bạn có thể thiếu quyền ghi vào thư mục cụ thể.

  • Bạn có thể đã vượt quá hạn ngạch của mình.

Tôi cũng đích thân đề nghị bạn nên sử dụng phương pháp sau đây đóng dòng:

if (this.file.exists()) { 
    try { 
     DataInputStream is = new DataInputStream(new FileInputStream(this.file)); 
     this.startDate = new DateTime(is.readLong(), this.timeZone); 
     this.endDate = new DateTime(is.readLong(), this.timeZone); 
    } catch (Exception ex) { 
     // Handle the exception here 
    } finally { 
     is.close(); 
    } 
} 

Bạn cũng có thể sử dụng IOUtils phương pháp closeQuietly mà không ném một ngoại lệ vì trong trường hợp của bạn, bạn không thay đổi tệp và có thể bạn không quan tâm đến kết quả của phương thức close.

EDIT:

Henry là đúng. Tôi đọc InputStream và tự động thay đổi nó trong tâm trí của tôi thành OutputStream.

Một hoạt động close trên InputStream không thay đổi các tập tin riêng của mình nhưng có thể thay đổi metadata của tập tin - chẳng hạn như thời gian truy cập cuối cùng vv

+0

Vẫn còn ngạc nhiên khi nhận được điều này trên 'InputStream'. – Henry

+0

@Henry - Bạn nói đúng. – Michael

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