2016-12-06 1 views
5

오늘 나는 자바 직렬화와 비 직렬화에서 이상한 행동을 보았다. (이해가 안 가기 때문에 "이상하다")Java가 발생할 수있는 디스크 공간 부족. io. EOFException

나는 리눅스 공유 디렉토리에서 객체를 직렬화하고 비 직렬화했다. 아무 문제없이 모든 작업을 직렬화하는 동안 동일한 파일을 deserialize하려고 시도하면 java. io. EOFException이 발생합니다. 또한 deserialize는이 새로 생성 된 파일에 대해서만 실패했으며 그 디렉토리에있는 다른 모든 이전 파일들에 대해 작업하고있었습니다.

그래서 인터넷을 검색하여 디스크 공간 부족이이 오류의 원인 일 수 있다고 언급 한 스레드를 발견했습니다.

그래서 임시 파일을 정리하고 효과가있었습니다. 디스크 공간 부족이 직렬화가 아닌 직렬화에만 영향을 줄 수 있다는 것을 이해하지 못합니까?

나는 아파치 평민 SerializationUtils 클래스를 사용하고 있습니다. 다음은 직렬화 및 직렬화 코드입니다.

SerializationUtils. serialize(myObject, new FileOutputStream(new File(sharePath+FILEName) ; 


MyObject object=SerializationUtils. deserialize(new FileInputStream(new File(sharePath+FILEName); 

누군가가이 동작을 설명 할 수 있다면 정말 도움이 될 것입니다. 나는 SerializationUtils의 버그가 IOException을 일으킨다 고 생각한다.

감사

+0

파일을 쓸 때 이전의'IOException'을 무시하지 않는 한 그렇게 할 수 없습니다. – EJP

+0

손으로 직렬화를 수행하지 않으므로 IOException이 SerializationUtils에 의해 관리됩니다. 그것의 javadoc에. –

+0

그래서 문제가 있거나 API 디자인이 좋지 않습니다. – EJP

답변

7

내 의심 파일을 기록 할 때, IOException가이 디스크 공간이 소진되어 발생되고 있지만, 직렬화 된 데이터의 시작은 아직 디스크에 기록 된 것입니다. 이것은 디스크에 저장된 직렬화 된 데이터가 불완전하므로 잘못된 결과가 발생하여 EOF 예외가 발생할 수 있습니다.

이 문제를 해결하려면 IO 예외 exception.getMessage()으로 디스크 공간이 부족하여 불완전한 데이터를 쓰지 않도록해야합니다.

+0

M 아파치 커먼즈를 사용하여, 그리고 그 안에 당신의 주장의 증거를 찾을 수 없습니다. 만약 당신이 IOException 아파치의 SerializationUtils에 뭔가를 발견했다면 알았어. –

+0

SerializationException 잡으려고? IOException를 throw하지 않고 파일을 쓰는 경우 IOException을 throw합니다. –