Если вы хотите создать свой собственный формат контейнера (архив) вместо использования существующего формата, анатомия будет выглядеть примерно так:
+-------------------------------------------------------------------------------+
| Header (checksum, magic number, etc) |
+-------------------------------------------------------------------------------+
| Manifest (list of file metadata like file names and offsets) |
+-------------------------------------------------------------------------------+
| File 1 header (usually file size) |
+-------------------------------------------------------------------------------+
| File 1 content |
+-------------------------------------------------------------------------------+
| ... |
+-------------------------------------------------------------------------------+
| File (n) header (usually file size) |
+-------------------------------------------------------------------------------+
| File (n) content |
+-------------------------------------------------------------------------------+
Если вам не нужно, чтобы ваш формат легко использовался различными платформами, вы можете создать классы, инкапсулирующие контейнер, обеспечить их сериализацию, а затем использовать сериализацию / десериализацию для преобразования контейнера в поток ( одна опция для преобразования объектов в байты).
Если вам нужно добавить сжатие или шифрование, вы должны обернуть этот архив внутри других конвертов (при необходимости добавляя верхние / нижние колонтитулы для указания необходимой информации о сжатии или шифровании).