Чтение байтов из файла с помощью fileinputstream для поиска потерянных изображений

Я пытаюсь прочитать файл .raw, чтобы найти некоторые «поврежденные» изображения. Я пробовал все. Насколько я понимаю, должно работать следующее

public void readFile(){
FileInputStream inFile = new FileInputStream(this.rawFile);
System.out.println(inFile.read());
}

но печатается только один байт. Мне нужно прочитать их все и найти байты 255 (означает начало нового изображения) и сохранить байты от первых 255 до следующих 255 (следующее изображение) в .jpg

Извините, если я не ясно здесь.

Пожалуйста, задавайте любые вопросы, которые могут у вас возникнуть.


person user1304317    schedule 16.04.2012    source источник
comment
read() фактически возвращает int   -  person ControlAltDel    schedule 16.04.2012
comment
@vikiiii: вы не правы - read() возвращает прочитанный байт (преобразованный в целое число) или -1 для EOF.   -  person Greg Kopff    schedule 16.04.2012


Ответы (1)


Вы вызываете read() метод в FileInputStream. Этот метод считывает один байт и возвращает его. Из Javadoc :

Считывает байт данных из этого входного потока. Этот метод блокируется, если вход еще не доступен.

У вас есть пара вариантов...

Вы можете продолжать читать по одному байту за раз, и в этом случае вам понадобится цикл:

int read;

while ((read = inFile.read()) != -1)
{
  // process the byte
}

В качестве альтернативы вы можете прочитать фрагмент файла в буфер и выполнить итерацию по буферу, используя read(byte[],int,int).

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

final byte[] buff = new byte[this.rawFile.length()];    // size the array
inFile.read(buff);                                      // read the whole file in
inFile.close();                                         // close the file descriptor

for (int i = 0; i < buff.length; i++)                   // search the in-memory buffer
{
  if (buff[i] == 0xFF)
  {
    // found marker byte ...
  }
}
person Greg Kopff    schedule 16.04.2012
comment
вы можете захотеть обработать байт, записав его в ByteArrayOutputStream. Это позволит вам сохранить все байты в одном изображении в один байт[] - person ControlAltDel; 16.04.2012
comment
Можно ли это сделать с помощью fileOutputStream? - person user1304317; 16.04.2012
comment
Кроме того, мне сказали, что файлы JPEG начинаются с байтов 255 216 255 224 (это целочисленные форматы байтов), как мне заставить программу остановиться, как только она найдет эту последовательность? - person user1304317; 16.04.2012
comment
@ user1304317: просто просмотрите дополнительные байты в буфере. Вам этого достаточно, чтобы продолжать? - person Greg Kopff; 16.04.2012
comment
ну никак не могу найти последовательность 255 216 255 224 я нахожу их все в разных местах а не подряд - person user1304317; 16.04.2012
comment
@ user1304317: вы открыли файл в шестнадцатеричном редакторе и посмотрели, существуют ли в файле эти последовательности маркеров? Как только мы узнаем, что они действительно есть, мы можем начать искать ошибку в коде... - person Greg Kopff; 16.04.2012
comment
@ user1304317: да, неважно, как мы это напишем - десятичное 255 - это шестнадцатеричное 0xFF. Ваша последовательность в шестнадцатеричном формате: 0xFF 0xD8 0xFF 0xE0. У вас есть шестнадцатеричный редактор/просмотрщик? - person Greg Kopff; 16.04.2012