Como sobrescrever dados em um arquivo em java

Olá pessoal, tudo bem?
Bom eu tenho um trabalho onde tenho q fazer um crud em um arquivo de dados organizados em bits.
para eu criar um novo registro eu tenho q ler o ultimo id guardado no inicio do arquivo de dados, atualizar o (novoRegistro.id = idLido + 1) e depois atualizar o inico do arquivo de dados com o id do ultimo registro criado, pórem não tenho nem ideia de como vou fazer para sobrecrever/trocar o id do cabeçalho pelo novo id. O código até agora está assim:

    public static void create(RandomAccessFile raf, String nome, String cpf, String cidade, List<String> emails, String usuario, String senha, float saldo){
        Contas temp = new Contas(0,nome, emails, usuario, senha, cpf, cidade, saldo);
        try {
            raf.seek(0);
            temp.idConta = (raf.readInt() + 1);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
       

    }

Tem vários jeitos de fazer, mas eu acho que faria algo assim:

Criaria uma classe para representar o meu banco de dados, que será um arquivo de texto.

E a cada inserção eu leria o banco inteiro, atualizaria o último id, adicionaria a nova conta e reescreveria tudo sobrescrevendo os dados anteriores.

Eu fiz um código de exemplo:

import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class App {
  private static final Path path = Path.of("db.txt");

  record Account(int id, String nome, String email) {
  }

  private static class Db {
    private int lastId;

    private List<Account> accounts;

    Db(int lastId, List<Account> accounts) {
      this.lastId = lastId;
      this.accounts = accounts;
    }

    void addAccount(final Account account) {
      this.accounts.add(account);
    }

    int getLastId() {
      return this.lastId;
    }

    int getNextId() {
      return ++this.lastId;
    }

    List<Account> getAccounts() {
      return this.accounts;
    }
  }

  private static Db readDb() {
    try {
      if (!Files.exists(path)) {
        Files.writeString(path, "0\n");
      }

      try (var scanner = new Scanner(Files.newInputStream(path)).useDelimiter(",|\n")) {
        final var lastId = scanner.nextInt();

        final var accounts = new ArrayList<Account>();

        while (scanner.hasNext()) {
          accounts.add(new Account(scanner.nextInt(), scanner.next().strip(), scanner.next().strip()));
        }

        return new Db(lastId, accounts);
      }
    } catch (final IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  private static void addAccount(String name, String email) {
    try {
      final var db = readDb();

      final var account = new Account(db.getNextId(), name, email);

      db.addAccount(account);

      final var lines = new ArrayList<String>();

      lines.add(Integer.toString(db.getLastId()));

      for (final var a : db.getAccounts()) {
        lines.add("%d, %s, %s".formatted(a.id(), a.nome(), a.email()));
      }

      Files.write(path, lines);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void main(String... args) {
    for (int i = 0; i < 10; i++) {
      addAccount("Nome " + i, "email" + i);
    }
  }
}
1 curtida