Число 1024 должно занимать, по меньшей мере, 2-4 байта (например, 16-32 бит), так как вам нужно знать, где заканчивается номер и где он начинается, и поэтому он должен иметь фиксированный размер. Если ваши позиции очень большие, например 124058936, вам нужно будет использовать 4 байта на числа (что было бы лучше, чем 9 байтов в виде строкового представления).
Используя двоичные файлы, вам понадобится способ узнать, где начинается и заканчивается строка. Вы можете сделать это хранение байт перед ним, с его длиной, и чтением строки, как это:
byte[] arr = new byte[in.readByte()]; // in.readByte()*2 if the string is encoded in 16 bits
in.read(arr); // in is a FileInputStream/RandomAccessFile
String yourString = new String(arr, "US-ASCII");
Другой Possiblity будет завершение вашей строки с нулевым символом (00), но вам нужно будет создать ваша собственная реализация для этого, поскольку ни один из читателей не поддерживает ее по умолчанию (AFAIK).
Теперь, действительно ли стоит хранить его в виде двоичных данных? Это действительно зависит от того, насколько велики ваши позиции (потому что строки, если в текстовой версии отделены от их позиции пробелом, занимают одинаковое количество байтов). Моя рекомендация заключается в том, что вы используете текстовую версию, так как, вероятно, будет легче разобрать и прочитать.
Об использовании одного или двух файлов это не имеет значения. Вы можете комбинировать текст и двоичный файл в одном файле, и он будет занимать одно и то же пространство (хотя для его создания в двух разделенных файлах всегда потребуется немного больше места, и это может сделать его более грязным для редактирования).
Как вы вычисляете числа? Я думал, что в строковом представлении каждое число составляет один символ = один байт? Если я сохраняю его как биты, то, например, 1024 = 10000000000 = 11 бит? Хотя в тексте 1024 = 4 * 8 = 32? – MrJalapeno
11 бит, но, как я уже сказал, вам нужен способ узнать, где начинается число и где оно заканчивается. Это делается с фиксированным размером, обычно 2 или 4 байта. Строковое представление - один байт на символ, да. – Emd4600
Игнорирование возвращаемого значения 'InputStream.read' запрашивает проблемы. – VGR