Чи існує спосіб змінити байт на інтони під час читання з вхідного потоку в Java?

Я читаю у файлі з InputStream до масиву байтів, а потім міняю кожен байт у int. Потім я зберігаю int в інший масив. Чи є спосіб зробити це більш ефективним? Зокрема, чи є спосіб використовувати тільки один масив замість двох? Розподіл обох масивів займає надто багато часу для моєї програми.

Це те, що я роблю зараз ( is - це InputStream):

byte[] a = new byte[num];
int[] b = new int[num];

try {
    is.read(a, 0, num);
    for (int j = 0; j < nPixels; j++) {
        b[j] = (int) a[j] & 0xFF; //converting from a byte to an "unsigned" int
    }
} catch (IOException e) { }
1
Я сподіваюсь, вам відомо, що read (байт [] b, int off, int len) не гарантує читання повного буфера.
додано Автор Mark Rotteveel, джерело

3 Відповіді

Давайте побачимо ... Ви не можете безпосередньо читати int, оскільки це буде спробувати прочитати 4 байти одночасно. Ви могли б сказати

int_array[j] = (int)is.read();

всередині циклу, якщо ви добре, читаючи потік за один байт одночасно.

0
додано
в абстрактному базовому класі InputStream, read (байт []) визначається в термінах абстрактного методу read (). Проте підкласи можуть перевизначити читання (байт []), щоб зробити його більш ефективним, ніж просто використовувати групу читань. Використання двох масивів не повинно займати достатньо пам'яті, щоб бути проблематичним, якщо у вас немає величезних масивів ... Іншим рішенням буде спроба використовувати масив байтів як є. На жаль, Java не має профспілок.
додано Автор aleph_null, джерело
Дякую за ваше рішення. Виявляється, час роботи більше, ніж у мене, перш ніж хоч, тому мені доведеться шукати інший спосіб ефективно кодувати його, я думаю.
додано Автор confusedKid, джерело
На жаль, у мене досить великі масиви (це для декодування файлу зображень). Це ще більша проблема для платформ Android! D:
додано Автор confusedKid, джерело

Ви переглянули DataInputStream або навіть FileInputStream ? Є багато інших методів, які дозволяють вам читати конкретні типи даних прямо з InputStream.

Я не знаю, чи це можливо у вашій ситуації лише з інформацією, яку ви надали.

0
додано
У моєму випадку я перетворюю кожен байт у потоці на int, і я боюся, що щось на зразок DataInputStream поставить 4 байти на int, що я не хочу.
додано Автор confusedKid, джерело

Чому б не використовувати метод non-argument InputStream.read (), який повертає int?

File file = new File("/tmp/test");
FileInputStream fis = new FileInputStream(file);
int fileSize = (int) file.length();//ok for files < Integer.MAX_SIZE bytes
int[] fileBytesAsInts = new int[fileSize];
for(int j = 0; j < fileSize; j++) {
    fileBytesAsInts[j] = fis.read();
}
0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників

android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.