Como ler um arquivo gigante sem dar estouro de memória?

6 respostas
java
K

Estou querendo copiar os bytes de um arquivo qualquer para uma byte array e modifica-los, o problema é que quando o arquivo é grande (aconteceu com um de 600MB) dá estouro de memória e o programa nem inicializa. Gostaria de saber qual método eu posso utilizar para copiar o arquivo aos poucos pra array e não tudo de uma vez, pensei em dividir o arquivo em vários pedaços mas não seria muito eficiente e nem saberia como fazer isso por código.

6 Respostas

C

Você pode usar um FileReader ou um FileInputStream, o primeiro trabalha com caracteres e o segundo com bytes.

R

É simples, é só não ler o arquivo todo para a memória.

K

Esse é o meu problema, como que eu não leio o arquivo todo para a memória? Vou ler melhor os métodos de file, veja como eu estou lendo: File leitura_do_arquivo = new File(“C:\Users\x\Desktop\kleber.txt”);
byte[] array = Files.readAllBytes(leitura_do_arquivo.toPath());

Como eu modificaria esse código para ler só parte do arquivo?

R

Simples. É só usar a biblioteca de I/O padrão do Java. Nesse caso, você usa a classe FileInputStream, como sugeriu o colega @claudemiro:

FileInputStream fis = new FileInputStream(new File("C:/arquivo.dat"));

byte [] buffer = new byte[2048];
int readBytes = fis.read(buffer, 0, 2048)
while(readBytes > 0){
    readBytes = fis.read(buffer, 0, 2048);
}

Assim, a cada iteração no loop você carrega apenas 2048 bytes por vez.

K

Aí a entrada(os bytes lidos) vai ficar armazenado na variável readBytes?

R

Não, a variável readBytes é simplesmente um contador de bytes lidos que serve para controlar o loop. Se você quer carregar os dados todos em uma variável então o arquivo ficará todo na memória. Usando um array de bytes, você conseguirá armazenar até por volta de 2GB de dados em um array. Outro detalhe é a quantidade de memória configurada para a JVM.

Criado 2 de outubro de 2016
Ultima resposta 10 de out. de 2016
Respostas 6
Participantes 3