2010-03-31 2 views
0

특수한 특성을 가진 파일을 읽기에 알맞은 인터페이스를 위해 몇 가지 힌트 나 팁을 사용할 수 있습니다.머리말과 꼬리말로 가변 길이 파일을 읽기위한 인터페이스

파일의 헤더 (~ 120 바이트), 본문 (1 바이트 - 3GB) 및 바닥 글 (4 바이트)이 있습니다.

헤더에는 본문에 대한 정보가 들어 있으며 바닥 글은 본문의 단순한 CRC32 값일뿐입니다.

나는 Java를 사용하여 "InputStream"클래스를 확장하고 "public MyInStream (InputStream in)"과 같은 생성자를 추가하여 즉시 헤더를 읽고 오버로드 된 read()가 본문을 직접 읽는 것이 었습니다. .

문제는 전 체가 읽힐 때까지 클래스의 사용자에게 CRC32 값을 제공 할 수 없다는 것입니다.

파일 크기가 3GB 일 수 있으므로 메모리에 저장하는 것이 좋습니다.

작은 파일이 많으면 임시 파일로 모두 읽으면 성능이 저하됩니다.

InputStream이 파일 일 필요가 없기 때문에 파일의 크기가 커도 소켓 일 수 있습니다.

다시 한번 살펴보면 InputStream을 확장하는 것이 나쁜 생각 일 수 있습니다.

피곤한 프로그래머의 혼란스러운 생각을 읽어 주셔서 감사합니다. :)

답변

0

다시 보니 어쩌면 InputStream을 확장하는 것은 좋지 않습니다.

클래스 사용자가 본문에 스트림으로 액세스해야하는 경우 IMO가 좋지 않습니다. Java의 ObjectOutput/InputStream은 이와 같이 작동합니다. 파일이 얼마나 큰 InputStream 인 파일을 수 이 없기 때문에

나는 그것이 소켓이 될 수 모른다.

음, 문제는 Java 클래스를 선택하는 것이 아니라 파일 형식을 디자인하는 것입니다. 형식을 변경할 수 없으면 파일의 끝 부분에있는 데이터를 모두 읽을 수 있도록하기 전에 수행 할 수있는 작업이 없습니다.

하지만 아마도 체크섬 처리를 완전히 캡슐화 할 수 있습니까? 아마도 몸체의 체크섬이므로 클래스가 항상 4 바이트를 미리 읽어 파일이 끝나는 시점을 확인하고 마지막 4 바이트를 본문의 일부로 클라이언트에 반환하지 않고 대신 읽는 동안 계산 된 CRC와 비교합니다 몸체가 일치하지 않을 때 예외를 throw합니다.

관련 문제