Почему некоторые функции Java требуют длины байтового массива, когда объект байтовых массивов уже был указан в аргументе? - PullRequest
0 голосов
/ 11 сентября 2018

При написании Java-кода мне действительно интересно, почему некоторым функциям требуется длина байтовых массивов в качестве аргумента, когда первым аргументом был объект байтовых массивов.Почему они не получают длину от предоставленного объекта?

Например:

// E.g.: 1. Bitmap
byte[] bytes = task.getResult();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);    

// E.g.: 2. Datagram
byte[] data = new byte[1024];
DatagramPacket request = new DatagramPacket(data, data.length);

Если им нужна длина, почему они не используют data.length?

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

В широком смысле буфер используется в качестве временных данных при обработке загрузки данных.
Вы заполняете буфер до его размера или меньше, но, конечно, не больше его емкости.
DatagramPacket Javadoc подтверждает, что:

Аргумент length должен быть меньше или равен buf.length.

И вещь, которую вы не должны забывать: концептуально вы используете буфер, потому что данные должны загружаться постепенно или только определенная часть этого.
В некоторых случаях вы будете читать столько данных, сколько их максимальный объем, но в некоторых других случаях вам нужно будет прочитать только первые байты X или байты от смещения X до Y.
Таким образом, методы класса буфера обеспечивают, как правило, несколько способов чтения из буфера.
Такие как:

public DatagramPacket(byte buf[], int length);
public DatagramPacket(byte buf[], int offset, int length);

Теперь концептуально вы не ошибаетесь, иногда вы хотите заполнить весь буфер, потому что вы знаете, что вам нужно будет прочитать именно такой размер данных. java.net.DatagramSocket подтверждает, что:

public synchronized void receive(DatagramPacket p) throws IOException {
...
   tmp = new DatagramPacket(new byte[1024], 1024);
...
}

Так что дополнительная перегрузка такая как:

public DatagramPacket(byte buf[]);

будет иметь смысл.

0 голосов
/ 11 сентября 2018

Поскольку данные, которые вы хотите прочитать, могут быть меньше или равны длине byte[] buf.

Ниже приведена документация API:

public DatagramPacket(byte[] buf,
              int length)

Constructs a DatagramPacket for receiving packets of length length.

The length argument must be less than or equal to buf.length.

Parameters:
    buf - buffer for holding the incoming datagram.
    length - the number of bytes to read.

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramPacket.html

0 голосов
/ 11 сентября 2018

Простой ответ: большинство read методов (на Java и любом другом языке), которые работают с буферными массивами , должны указывать точное количество байтов, которые были фактически прочитано.

Имейте в виду: этот массив является буфером. Поведение по умолчанию заключается в том, что buffer.length или меньше байтов могут быть прочитаны. Так что, зная, каков long буфер, вам не помочь. Вы должны знать, сколько байтов было на самом деле помещено в буфер.

0 голосов
/ 11 сентября 2018

Массив байтов - это буфер, в который считываются данные, длина которых меньше длины буфера. Параметр длины определяет количество байтов в буфере, которые актуальны. Вы не должны передавать длину буфера в параметре, который будет избыточным. Вы должны передать количество байтов в буфере, которые содержат фактические данные.

Документация API DatagramPacket, например, показывает это.

length - the number of bytes to read
...