2015-08-23 2 views
1

Как все уже знают, Java выделяет размер массива при объявлении. Это означает, что если я определить массив так:Как получить количество элементов в массиве байтов?

byte[] buffer = new byte[10]; 

buffer.length вернется 10. Тем не менее, на мой вопрос, как я могу узнать, сколько элементов заполняются. Я заполняю элементы из InputStream, поэтому я никогда не знаю, сколько будет элементов.

Я знаю, что выделенные позиции массива, которые пусты, будут 0, но что делать, если я получаю нулевые значения от InputStream, а также смешанные с нормальными значениями?

+2

Вы не можете. Просто сохраните количество байтов, которое вы прочитали в переменной. InputStream.read() возвращает количество прочитанных байтов. Если вы разместили свой код, мы могли бы рассказать вам, как его лучше писать. –

+2

Обычно методы, которые вы должны использовать для чтения _into_ массива 'byte', либо возвращали массив, содержащий только фактически прочитанный контент, либо возвращали количество прочитанных байтов. Таким образом, ваш прецедент - лучшая в лучшем случае. Как упоминал @JBNizet, вы никогда не показывали нам никакого кода. –

+0

@ JBNizet, вы были правы. Я могу получить фактический размер, используя InputStream.read(). Оно работает! Супер. Пожалуйста, ответьте на мой вопрос, чтобы я мог отметить его как правильно. –

ответ

2

Вы не можете. Просто сохраните количество байтов, которое вы прочитали в переменной. InputStream.read() возвращает количество прочитанных байтов:

Возвраты:

общее число байтов, считанных в буфер, или -1, если нет больше данных, потому что конец потока был достигнут.

1

Вы можете предварительно заполнить массив некотором недействительным значением, которое не должно быть получено InputStream. Однако это зависит от содержимого InputStream, поэтому выбор общего значения по умолчанию не очень-то просто.

Еще одна возможность для вас - использовать некоторую коллекцию, например List<Byte> или Set<Byte> (если вам нужна уникальность) - в этом случае количество заполненных элементов будет просто размером с коллекцией, и если вам действительно нужен массив на end, вы можете легко создать его из содержимого коллекции.

+0

Его проблема на самом деле не возникает со стандартными процедурами массива байтов в байтах, AFAIK. –

+0

Предпусковая вещь была бы удивительной, проблема заключается в том, что массив массива - это байт ... который не дает мне много уникальных опций; /. Думаю, я мог бы использовать коллекцию. –

0

Вы можете подсчитать количество байтов, прошедших через InputStream, например. используя Apache Commons CountingInputStream. Или вы можете расширить FilterInputStream самостоятельно, если у вас нет Apache Commons.

1

Давайте посмотрим на этот кусок кода:

InputStream inputStream = new FileInputStream(new File("fileName")); 
int cntReadBytes = 0; 
byte[] bytes = new byte[10]; 
     while((i = inputStream.read()) != -1) { 
      bytes[cntReadBytes] = i; 
      cntReadBytes++; 
     } 
     System.out.println("You have read total: " + cntReadBytes + " bytes"); 

, как вы можете видеть в состоянии в то время как петли я делаю сравнение InputStream возвращения и -1, когда возвращаемое значение отличается это означает, что у меня больше данные для чтения, когда он достигнет конца файла, он вернет -1. Таким образом, значение cntReadBytes будет числом итераций, то есть успешно считывает байты.

Или, если вы вправе использовать Список, вам не о чем беспокоиться.

+0

Чтение одного байта за раз по-настоящему неэффективно. И что это за необъявленная переменная res? –

+0

Я знаю, что это не такой эффективный подход, но это единственный способ, вот как я это делаю. Если вы знаете лучший способ, напишите об этом. – Chris

+0

Err, да, используйте 'InputStream.read (byte [])' вместо 'InputStream.read()'. Прочтите мой ответ. Прочтите javadoc. –

Смежные вопросы