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.
Você pode usar um FileReader ou um FileInputStream, o primeiro trabalha com caracteres e o segundo com bytes.
É simples, é só não ler o arquivo todo para a memória.
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?
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.
Aí a entrada(os bytes lidos) vai ficar armazenado na variável readBytes?
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.