Java 什么';在字节流中间添加数据的最有效方法是什么?

Java 什么';在字节流中间添加数据的最有效方法是什么?,java,stream,Java,Stream,我一直在制作一个图像重缩放器,它使用Java中的ImageIO库将它们转换为缓冲图像。不幸的是,它不能识别我可能传递给它的每种类型的JPEG,因此我需要“转换”这些其他类型。我转换它们的方法是从标准JFIF JPEG中获取现有的APP0标记,我要做的是在文件的第3个字节插入18个字节的数据(FFE0标记和16个字节的APP0标记),然后我要将文件的其余部分添加到该文件的末尾 一般来说,在流/文件中间添加/插入数据字节的最有效方法是什么 提前感谢, 阿列克谢蓝 这个问题与我之前的一个问题有关,因此

我一直在制作一个图像重缩放器,它使用Java中的ImageIO库将它们转换为缓冲图像。不幸的是,它不能识别我可能传递给它的每种类型的JPEG,因此我需要“转换”这些其他类型。我转换它们的方法是从标准JFIF JPEG中获取现有的APP0标记,我要做的是在文件的第3个字节插入18个字节的数据(FFE0标记和16个字节的APP0标记),然后我要将文件的其余部分添加到该文件的末尾

一般来说,在流/文件中间添加/插入数据字节的最有效方法是什么

提前感谢, 阿列克谢蓝

这个问题与我之前的一个问题有关,因此我要感谢onemasse在这里给出的答案。

如果是文件,建议将现有文件复制到新文件,在适当的位置插入、更改或删除字节。然后将新文件重命名为旧文件


理论上,您可以尝试使用RandomAccessFile(或等效工具)对现有文件执行就地更新。然而,这有点棘手,没有你想象的那么有效,而且。。。最重要的是。。。这是不安全的。(如果您的应用程序或系统在不适当的时候死机,您将留下一个已损坏的文件,无法恢复。)

如果您正在从流中读取图像,您可以制作一个代理,它的作用类似于输入流,并获取输出流。重写read方法,使其在丢失额外丢失的字节时返回这些字节


可以通过扩展FilterInputStream来创建代理。

A可能是您所需要的。

感谢各位的建议,我起初使用了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
if(isJPEG(路径))
{
fis=新文件输入流(路径);
字节=新字节[(int)(新文件(path).length())];
APP0=hexStringToByteArray(APP0Marker.replaceAll(“,”);
for(int index=0;index=2&&index