Интерфейс для чтения файлов переменной длины с верхним и нижним колонтитулом - PullRequest
0 голосов
/ 31 марта 2010

Я мог бы использовать некоторые советы или подсказки для приличного интерфейса для чтения файла с особыми характеристиками.

У рассматриваемых файлов есть заголовок (~ 120 байт), тело (1 байт - 3 ГБ) и нижний колонтитул (4 байта).

Верхний колонтитул содержит информацию о теле, а нижний колонтитул представляет собой простое значение CRC32 для тела.

Я использую Java, поэтому моя идея состояла в том, чтобы расширить класс «InputStream» и добавить конструктор, такой как «public MyInStream (InputStream in)», где я немедленно читаю заголовок, а непосредственное переопределенное read () - тело.

Проблема в том, что я не могу дать пользователю класса значение CRC32, пока не будет прочитано все тело.

Поскольку размер файла может составлять 3 ГБ, рекомендуется поместить его в память.

Чтение всего этого во временный файл станет ударом по производительности, если будет много маленьких файлов.

Я не знаю, насколько велик файл, потому что InputStream не обязательно должен быть файлом, это может быть сокет.

Глядя на это снова, возможно, расширение InputStream - плохая идея.

Спасибо, что прочитали запутанные мысли уставшего программиста. :)

1 Ответ

0 голосов
/ 31 марта 2010

Глядя на это снова, возможно, продолжая InputStream - плохая идея.

Если пользователям этого класса необходимо получить доступ к телу в виде потока, это IMO - неплохой выбор. ObjectOutput/InputStream в Java работает следующим образом.

Я не знаю, насколько большой файл потому что InputStream не имеет быть файлом, это может быть сокет.

Хм, тогда ваша проблема не с выбором класса Java, а с дизайном формата файла. Если вы не можете изменить формат, на самом деле вы ничего не можете сделать, чтобы сделать данные в конце файла доступными до того, как все они будут прочитаны.

Но, возможно, вы могли бы полностью инкапсулировать обработку контрольной суммы? Предположительно это контрольная сумма для тела, поэтому ваш класс всегда может «прочитать вперед» 4 байта, чтобы увидеть, когда файл заканчивается, и не вернуть последние 4 байта клиенту как часть тела, а вместо этого сравнить их с CRC, вычисленным во время чтения. тело, выбрасывающее исключение, когда оно не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...