2015-06-15 3 views
1

Мое приложение читает png-подобный файл (в байтах) и сохраняет байты в байтовый массив. Это метод я использую:Пропустить байты в ByteArray Java

public static byte[] read(File file) throws IOException { 

     byte []buffer = new byte[(int) file.length()]; 
     InputStream ios = null; 
     try { 
      ios = new FileInputStream(file); 
      if (ios.read(buffer) == -1) { 
       throw new IOException("EOF reached while trying to read the whole file"); 
      }   
     } finally { 
      try { 
       if (ios != null) 
         ios.close(); 
      } catch (IOException e) { 
      } 
     } 

     return buffer; 
    } 

После этого, я хочу, чтобы извлечь образцы этого ByteArray.

Он следует шаблону файла png:
Длина 4 байта + 4 байта + данные (необязательно) + CRC и повторяет эту схему.

Я хочу сделать что-то вроде do while: чтение длины + типа. Если меня не интересует тип, я хочу пропустить этот кусок. Но я боюсь, потому что не могу найти пропустить метод для byteArray [].

У кого-нибудь есть идея, как действовать дальше?

ответ

2

Пытались использовать ByteArrayInputStream http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html? есть метод пропуска

+0

Я видел этот класс раньше. Но я не знаю, как его использовать. Должен ли я заменить свой FileInputStream на мой ByteArrayInputStream? – tmylamoule

+0

Если нет ничего важного для вас в FileInputStream, вы можете просто заменить его, оба они имеют один и тот же суперкласс. Достаточно ли такого примера для вас http://www.tutorialspoint.com/java/io/bytearrayinputstream_skip.htm? – Czarny

+0

Да, спасибо за помощь. Я работаю над этим. Вы получите отзыв! ;) – tmylamoule

0

Если вы хотите итерировать массив через некоторое время, и вам нужно перейти к следующей итерации при заданном условии, вы можете использовать метку, чтобы перейти к следующей итерации цикла.

Синтаксис выглядит следующим образом:

do { 
    if (condition) { 
     continue; 
    } 
    // more code here that will only run if the condition is false 
} while(whatever you use to iterate over your array); 
+0

Это моя идея. Но я не знаю, как заполнять белые аргументы. На данный момент я создал «цикл цикла», который увеличивает байты на байты и ищет 4-байтовый ТИП. Но этот цикл настолько медленный: 7 секунд для файла 20 Мб. (У меня есть файл 250 МБ для чтения) – tmylamoule

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