Pergunta

Eu preciso adicionar informações do cabeçalho a um arquivo jpeg para que ele funcione corretamente quando compartilhado em alguns sites, eu rastreei as informações corretas através de muita escavação hexadecimal, mas agora estou meio que tentando obter no arquivo. Eu sei para onde no arquivo ele precisa ir e sei quanto tempo dura, meu problema é que o RandomAccessFile apenas substitui os dados existentes no arquivo e o FileOutputStream anexa os dados ao final. Também não quero, quero inserir dados começando no terceiro byte.

Meu código de exemplo:

File fileToChange = new File("someimage.jpg");

byte[] i = new byte[2];
i[0] = (byte)Integer.decode("0xcc");
i[1] = (byte)Integer.decode("0xcc");

RandomAccessFile f = 
    new RandomAccessFile(new File("videothing.jpg"), "rw");
long aPositionWhereIWantToGo = 2;
f.seek(aPositionWhereIWantToGo); // this basically reads n bytes in the file
f.write((byte[])i);
f.close();

Portanto, isso não funciona porque substitui e não se insere, não consigo encontrar nenhuma maneira de apenas inserir dados em um arquivo

Foi útil?

Solução

Você precisará usar o outputsteam e o InputStream em conjunto. Leia o arquivo usando o InputStream e escreva os 2 primeiros bytes no arquivo original. A inserção do seu conteúdo hexadecimal e, em seguida, leia o restante do fluxo de entrada e escreva no outputSteam.

Método a ser usado para leitura:

public int read(byte b[], int off, int len)

Método a ser usado para escrever:

public void write(byte b[], int off, int len) 

Outras dicas

Reescreva uma cópia do arquivo inserindo os dados nele no local desejado. Ou escreva um OutputStream Isso injeta os dados se você quiser fazê-lo on-the-fly ao transmitir, por exemplo, uma resposta HTTP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top