Какой самый эффективный способ добавить данные в середине потока байтов? - PullRequest
0 голосов
/ 08 ноября 2011

Я делаю масштабировщик изображений, который использует библиотеку ImageIO в Java для преобразования их в буферизованное изображение.К сожалению, он не распознает каждый тип JPEG, который я могу передать ему, и поэтому мне нужно «преобразовать» эти другие типы.Я конвертирую их, чтобы взять существующий тег APP0 из стандартного JFIF JPEG, и я хочу, чтобы на 3-м байте в файл было вставлено 18 байт данных (маркер FFE0 и 16-байтовый тег APP0) изатем я хочу добавить остальную часть файла в конец этого.

Итак, чтобы обобщить, каков наиболее эффективный способ добавления / вставки байтов данных в середине потока / файла?

Спасибо заранее, Алексей Блю.

Этот вопрос связан с моим предыдущим вопросом, и поэтому я хотел бы поблагодарить onemasse за ответ, данный там. Java JPEG Converter для нечетных типов изображений

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

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

Прокси-сервер можно создать, расширив FilterInputStream http://download.oracle.com/javase/6/docs/api/java/io/FilterInputStream.html

0 голосов
/ 21 ноября 2011

Спасибо за предложение, ребята, я сначала использовал FilterInputStream, но потом увидел, что в этом нет необходимости, я использовал следующий фрагмент кода для ввода моего шестнадцатеричного тега APP0 в:

private static final String APP0Marker = "FF E0 00 10 4A 46 49 46 00 01 01 01 00 8B 00 8B 00 00";

И в желаемом методе преобразователя:

        if (isJPEG(path))
        {
            fis = new FileInputStream(path);
            bytes = new byte[(int)(new File(path).length())];
            APP0 = hexStringToByteArray(APP0Marker.replaceAll(" ", ""));

            for (int index = 0; index < bytes.length; index++)
            {
                if (index >= 2 && index <= (2 + APP0.length - 1))
                {
                    b = APP0[index-2];
                }
                else
                {
                    b = (byte) fis.read();
                }//if-else

                bytes[index] = b;
            }//for

            //Write new image file
            out = new FileOutputStream(path);
            out.write(bytes);
            out.flush();
        }//if

Надеюсь, это поможет любому, кто сталкивался с подобной проблемой:)

0 голосов
/ 09 ноября 2011

A PushbackInputStream может быть тем, что вам нужно.

0 голосов
/ 08 ноября 2011

Если это файл, рекомендуемый способ сделать это - скопировать существующий файл в новый, вставив, изменив или удалив байты в соответствующих точках.Затем переименуйте новый файл в старый.

Теоретически вы можете попытаться использовать RandomAccessFile (или эквивалентный) для обновления существующего файла на месте.Тем не менее, это немного сложно, не так эффективно, как вы можете себе представить, и ... самое главное ... это небезопасно.(Если ваше приложение или система умирает в неподходящий момент, у вас остался сломанный файл, и у вас нет возможности его восстановить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...