2011-10-10 3 views
0

Java에서 RandomAccessFile을 사용하여 데이터를 관리합니다. 간체 : 파일의 시작 부분에 색인이 있습니다. (실제 데이터를 찾을 수있는 오프셋을 나타내는 데이터 세트 당 8 바이트 길이 값).RandomAccessFile에 데이터 삽입 및 인덱스 업데이트

그래서 지금 내가 원하는 경우 예를 들어 데이터 세트 3의 데이터를 찾을 수 있습니다. 나는 8 바이트 오프셋 (2 * 8)을 읽었다. 색인 생성은 0부터 시작합니다.

데이터 세트 자체는 데이터 세트의 크기를 나타내는 4 바이트와 데이터 세트에 속한 모든 바이트로 구성됩니다.

그래서 항상 전체 파일을 다시 작성하기 때문에 잘 작동합니다.

여기서 중요한 것은 데이터 세트 3이 파일의 첫 번째 항목으로 작성되어 색인이 정렬되었지만 데이터 자체는 작성되지 않았다는 것입니다.

새 데이터 세트를 삽입하면 항상 파일 끝에 추가됩니다. 그러나 하나의 파일 일 수있는 데이터 세트의 수는 제한적입니다. 파일에 100 개의 데이터 세트를 저장할 수 있다면 인덱스에는 항상 100 개의 항목이 있습니다. 데이터 세트의 인덱스에서 읽은 오프셋이 0이면 데이터 세트가 새로운 것으로 파일에 추가됩니다.

부 나를 위해 아직 작동하지 않는 케이스가 하나 있습니다. 내가 데이터 셋을 읽으면. 3 파일에서 및 일부 응용 프로그램에서 데이터를 추가하고 파일을 업데이트하려면 어떻게 해야할지 모르겠다.

길이가 같으면 이전 데이터를 덮어 쓸 수 있습니다. 그러나 새 데이터 세트가 이전 데이터 세트보다 많은 바이트를 가지고 있다면이 데이터 세트 뒤에있는 파일의 모든 데이터를 이동하고 이러한 데이터 세트의 색인을 업데이트해야합니다.

어떻게 할 수 있습니까? 아니면 이러한 데이터 집합을 파일에 저장하는 것을 관리하는 더 좋은 방법이 있습니까?

추신 : 당연히 데이터베이스를 사용하려고 생각했지만 프로젝트에는 적용 할 수 없습니다. 정말 간단한 파일이 필요합니다.

답변

1

파일의 중간에 데이터를 쉽게 삽입 할 수 없습니다. 기본적으로 남아있는 모든 데이터를 읽고 "새"데이터를 작성한 다음 "이전"데이터를 다시 작성해야합니다. 또는 이전 "느린"파일을 무효화하고 (잠재적으로 파일을 나중에 다시 사용할 수 있도록 허용) 파일의 끝에 새로운 전체 레코드를 쓸 수 있습니다. 귀하의 파일 형식은 내게 솔직히 분명하지 않지만 근본적으로 파일의 중간에 삽입 (또는 삭제) 할 수 없음을 알아야합니다.

+0

나는 오랫동안 메모리에 데이터를 보관하고 항상 전체 파일을 다시 작성하는 것처럼 보입니다. – Chris

+0

@Chris : 이전 파일을 청크로 새 파일 청크에 복사하여 많은 메모리를 사용하지 않고도 항상 수행 할 수 있습니다. –

0

일부 데이터를 관리하는 Java에서 RandomAccessFile이 있습니다.

바로 그곳에서 중지하십시오. 파일이 입니다. 현재 Java의 RandomAccessFile을 통해 액세스하고 있습니다. 그러나 전체 질문은 파일 자체와 관련이 있으며 RandomAccessFile 또는 Java와는 관련이 없습니다. 1979 년 이후로 사용했던 파일 시스템에 존재하지 않는 파일의 중간에 삽입하는 등의 기능을 가정 할 때 주요 파일 설계 문제가 있습니다.

+0

실제로 파일 시스템이 파일의 중간에 데이터를 삽입 할 수 있다고 가정하지 않았습니다. 나는 이것을하기에 적합한 방법을 찾고 있었다. (파일의 나머지 부분을 읽고 다시 쓰는 것). 내가 할 때이 파일의 색인을 유지할 수있는 방법을 찾기를 바랬습니다. – Chris

0

다른 사람들도 역시 대답 했으므로 실제로는 그렇지 않습니다 전체를 다시 쓰지 않고도 파일을 길게/짧게 만들 수 있습니다. 일부 해결 방법은이며 어쨌든 한 가지 해결책이 효과적 일 수 있습니다.

  • 모든 데이터 세트를 고정 길이으로 제한하십시오.
  • 색인을 변경/제거하여 삭제하고 파일의 끝에 항상 추가하여 추가하십시오. 이전 데이터 집합을 제거하고 새 데이터 집합이 더 길면 끝에 새 데이터 집합을 추가하여 업데이트하십시오. 실제로 "무시 된 데이터 세트"를 삭제하고 모든 유효한 데이터 세트를 함께 이동하여 (모든 데이터 다시 쓰기) 때때로 파일을 압축하십시오.
  • 데이터 세트를 고정 길이로 제한 할 수없고 데이터 세트를 업데이트하여 데이터 세트를 더 길게 만들려는 경우 데이터 세트의 첫 번째 부분 끝에 포인터를두고 파일의 뒷부분에서 계속할 수도 있습니다. 따라서 연결된 목록과 같은 구조를 얻을 수 있습니다. 편집이 많이 이루어지는 경우에는 & 파일을 다시 배열하는 것이 좋습니다.

대부분의 솔루션에는 데이터 오버 헤드가 있지만 파일 크기는 일반적으로 문제가 아니며 언급 한대로 일부 방법을 "정리"할 수 있습니다.

추신 : 나는 그런 오래된 질문에 답변하는 것이 좋습니다. 도움말 센터에서 관련 정보를 찾을 수 없으며 비교적 최근에 생겼습니다.

관련 문제