2010-07-04 3 views
0

나는 자바 객체를 작성하는 파일을 가지고있다. 글을 쓰고 난 후 때때로 파일의 람직한 위치에있는 이러한 객체 중 일부를 삭제해야합니다. 전체 파일을 바꾸지 않고 파일에서 선택한 개체를 삭제하는 방법이 있습니까?자바에서 데이터 파일의 일부를 삭제

감사합니다.

답변

5

아니요, 이것은 근본적으로 대부분의 파일 시스템이 지원하지 않는 것입니다. (저렴한 가격으로 만들 수있는 특수한 데이터 구조가있을 수 있지만 대부분은 그렇지 않습니다. 표준 API는이 아이디어를 지원하지 않습니다.)

파일의 일부를 "삭제하는"가장 간단한 방법은 파일을 복사하는 것입니다. 새로운 파일에 원하는 비트 만 있으면됩니다. 끝 부분의 비트 만 제거하는 경우 잠재적으로 다시 시작 부분을 복사하지 않아도되지만 더 복잡한 코드가 필요합니다.

개체 스트림의 경우 하나의 스트림에서 개체를 읽고 원하는 개체를 새로운 스트림으로 작성하는 것이 가장 좋습니다. (분명히 나중에 출력 파일의 이름을 바꿀 수 있습니다.) 직렬화 형식을 직접 보면서 반복되는 직렬화/직렬화에 필요한 처리를 피할 수는 있지만 간단하게 시작할 수는 있습니다.

2

@ 존 스킷은 정확합니다.

기술적으로 직렬 스트림의 객체를 ... 뭔가 다른 것으로 바꾸는 것이 가능한지 궁금합니다. 적절한 바이트 패턴으로 덮어 쓰면됩니다. 나는 대답이 '아니오'라고 생각한다.

제가 생각할 수있는 가장 좋은 점은 0x73 바이트의 시퀀스로 덮어 쓰는 것이 었습니다 ... null; Java Object Serialization Specification Chapter 6을 참조하십시오. 0x73 바이트 덮어 쓰기

  • 직렬화 된 객체 스트림을 읽는 응용 프로그램의 삶을 어렵게 만들 것입니다 여러 null들로 하나 개의 객체를 돌려 것이다 :하지만이 세 가지 심각한 문제가있다.
  • 스트림의 다른 개체가 clobbered 개체에 대한 참조를 포함하면 해당 참조가 손상되어 예외가 발생합니다.
  • clobbered 할 개체에 대한 스트림으로 시작 및 바이트 오프셋을 파악하는 것이 어려울 수 있습니다.

실제로 가장 좋은 대답은 삭제할 개체를 생략하고 개체 스트림을 다시 작성하는 것입니다.

1

RandomAccessFile을 사용하고 공백으로 개체를 덮어 쓸 수 있습니다. 그런 다음 오프라인 모드에서자를 수 있습니다.

+1

"공백"으로 덮어 쓰면 대부분 읽을 수 없거나 손상된 개체 스트림이됩니다. –

0

실제로 삭제하지 않고도 여유 공간임을 알리기 위해 객체를 표시 할 수 있습니다. 추가 할 다음 객체는 삽입 된 경우 삭제 된 객체가 생성 한 틈에 삽입 될 수 있습니다. 분명히 새로운 객체는 공간을 남겨두고 간격을 채우지 않을 것입니다. 내부 분할은 많은 추가/삭제주기로 증가 할 것으로 예상해야합니다.

때마다 "조각 모음"실행을 수행하여 모든 개체를 압축하여 모든 작은 간격을 제거합니다.

관련 문제