[Resolvido] Abrir arquivo parcialmente (bytes)

Boa tarde pessoal!

Estou precisando abrir arquivos razoavelmente grandes usando Java (arquivo com 250MB, 400MB, nessa faixa).

Após abertos, transformo eles em um array de bytes e trabalho como preciso.

Estou fazendo isso com o FileInputStream, e está funcionando sem problemas.

Mas pelo que entendo, quando tenho o arquivo aberto no FileInputStream, ou mesmo quando coloca ele em um array de bytes, ele fica em memória, correto?

Então, eu não queria ficar colocando esses arquivo inteiros em memória (uma vez vários arquivos serão abertos ao mesmo tempo), seria possível em pegar somente um pedaço dele? Algo tipo “pegar somente o trecho de X até Y”, e trabalhar somente com os bytes desse trecho (não me importa que seja um fragmento).

Existe isso? Estou falando alguma besteira?

Muito obrigado!

Usando um RandomAccessFile você pode fazer exatamente o que você quer fazer (abrir um arquivo, ler só um determinado pedaço dele, e escrever de volta na mesma ou em outra posição).

Uma coisa que não dá para fazer, infelizmente, é “inserir” dados dentro do arquivo (ou seja, no meio do arquivo, você conseguir adicionar mais dados e deslocar os dados que vêm depois) - mas isso é uma limitação intrínseca aos arquivos em disco na maior parte dos sistemas operacionais e filesystems; você só pode sobrepor ou adicionar ao fim do arquivo.

Desculpem, repeti duas vezes o post abaixo (se for possível apagarem este).

[quote=entanglement]Usando um RandomAccessFile você pode fazer exatamente o que você quer fazer (abrir um arquivo, ler só um determinado pedaço dele, e escrever de volta na mesma ou em outra posição).

Uma coisa que não dá para fazer, infelizmente, é “inserir” dados dentro do arquivo (ou seja, no meio do arquivo, você conseguir adicionar mais dados e deslocar os dados que vêm depois) - mas isso é uma limitação intrínseca aos arquivos em disco na maior parte dos sistemas operacionais e filesystems; você só pode sobrepor ou adicionar ao fim do arquivo. [/quote]

Cara creio que essa classe que você mencionou seja exatamente o que eu preciso. Li rapidamente agora um pouco sobre ela, e me parece ser o que preciso, pois não vai “ferrar” com a memória subindo o arquivo todo de um mês.

Vou estudar mais ela e assim que ver se funciona como entendi, coloco o post como resolvido para ficar mais fácil para quem precisar.

Muito obrigado pela ajuda tão rápido!

Bom dia,

Fiz alguns testes no feriadinho e me parece que a sugestão do entanglement era exatamente o que eu estava precisando.

Preciso testar mais, mas pelo que testei até agora o tempo de execução é maior quando uso o RandomAccessFile, porém a memória fica só com a parte do arquivo que preciso.

Usando o FileInputStream simplesmente, o tempo de execução é muito menor, porém ele sobe o arquivo todo em memória.

Para o meu caso é preferível que demore mais e ocupe menos memória, portanto o RandomAccessFile é a opção mais interessante!

Valeu!