Что подразумевается под чтением данных машинно-независимым способом?

#java #sockets

#java #сокеты

Вопрос:

  1. В документации класса DataInputStream говорится, что он способен считывать данные машинно-независимым способом, что именно это значит?
  2. Означает ли это, что он будет получать одни и те же данные независимо от того, на каком языке программирования записан другой конец связи сокета?
  3. Полезен ли DataInputStream для чтения примитивов, отправленных из приложения / программы, написанной на другом языке (например, если приложение C отправляет, а приложение Java получает), если нет, какой класс будет?

Комментарии:

1. Я думаю, что речь идет о порядке следования. Таким образом, если процесс A, работающий на платформе big-endian, записывает данные с использованием DataOutputStream, то процесс B, работающий на платформе little-endian, должен иметь возможность считывать их с помощью DataInputStream.

Ответ №1:

DataInputStream работает с последовательностью байтов. Когда он считывает большие значения из такой последовательности, он использует фиксированную интерпретацию. Например, при чтении int, для которого требуется 4 байта, он считывает их в формате big-endian. То есть, если поток байтов содержит 0x01 0x23 0x45 0x67 , DataInputStream будет считывать это как целое 0x01234567 число.

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

Кроме того, он определяет точный размер и представление нескольких типов данных, размеры которых зависят от среды выполнения на других языках программирования. Например, тип int C int имеет ширину не менее 16 бит, в то время как Java определяет его как ровно 32 бита, как и DataInputStream Java.

DataInputStream отлично подходит, когда вам нужно обмениваться данными между программами Java. Если вам необходимо обмениваться данными между различными языками программирования, вам следует использовать другую библиотеку, которая реализована на всех задействованных языках программирования. Может быть, protobuf от Google. Или, если ваши данные являются текстовыми, используйте JSON или XML.

Комментарии:

1. Это не просто порядковый номер. Это следует контракту DataInput . Таким образом, readInt всегда считывается 4 байта для int. readFloat всегда считывает 4 байта. Также всегда указывается порядковый номер.