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

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.