HOWTO · Java

Grave o byte no arquivo em Java

Este artigo mostra como gravar byte em arquivo em Java

Nesta página

Este tutorial demonstra como gravar um array de bytes em um arquivo em Java. A biblioteca padrão oferece duas opções práticas — um FileOutputStream para gravações no estilo de fluxo e o método Files.write() do NIO para uma operação de chamada única — e o Apache Commons IO adiciona o FileUtils.writeByteArrayToFile() como conveniência para projetos que já carregam a dependência. Todos os exemplos convertem texto em bytes com StandardCharsets.UTF_8, de modo que o arquivo gravado não dependa do conjunto de caracteres padrão da máquina.

Grave um array de bytes com FileOutputStream

O FileOutputStream é o fluxo clássico orientado a bytes em java.io. Construí-lo sobre um nome de arquivo cria o arquivo quando ele está ausente e substitui o conteúdo de um arquivo que já existe; passe true como segundo argumento do construtor quando quiser anexar em vez de substituir. O fluxo mantém um identificador do sistema operacional, portanto feche-o quando a gravação terminar — o try-with-resources realiza o fechamento automaticamente.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

class ByteToFile {
  public static void main(String[] args) throws Throwable {
    byte[] data = "DelftStack writes bytes".getBytes(StandardCharsets.UTF_8);
    try (FileOutputStream out = new FileOutputStream("stream-demo.bin")) {
      out.write(data);
    }
    System.out.println("Wrote " + data.length + " bytes to stream-demo.bin");
  }
}
Wrote 23 bytes to stream-demo.bin

O getBytes(StandardCharsets.UTF_8) codifica a string de forma determinística; chamar getBytes() sem argumento usa o conjunto de caracteres padrão da plataforma e pode produzir bytes diferentes em outra máquina. O write(data) grava o array inteiro, enquanto o write(data, offset, length) grava apenas uma fatia quando você precisa de uma. Quando o próprio construtor falha — um caminho que nomeia um diretório, um diretório pai que não existe ou permissão de gravação ausente — o Java lança uma FileNotFoundException, portanto escolha um destino gravável antes de abrir o fluxo.

Grave um array de bytes com Files.write()

A API java.nio.file condensa toda a operação em uma única chamada. O Files.write() abre o caminho, grava todos os bytes e fecha o arquivo; por padrão, ele cria o arquivo quando ausente e o trunca quando presente. Passe opções de abertura como StandardOpenOption.APPEND para anexar ou StandardOpenOption.CREATE_NEW para falhar quando o arquivo já existe.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

class ByteToFileNio {
  public static void main(String[] args) throws Throwable {
    byte[] data = "NIO write sample data".getBytes(StandardCharsets.UTF_8);
    Path target = Paths.get("nio-demo.bin");
    Files.write(target, data);
    System.out.println("Wrote " + data.length + " bytes to nio-demo.bin");
  }
}
Wrote 21 bytes to nio-demo.bin

O método declara IOException, e suas falhas comuns são descritivas: NoSuchFileException quando um diretório pai está ausente, AccessDeniedException quando o processo não tem permissão e FileAlreadyExistsException quando você passa CREATE_NEW para um arquivo existente. Escolha o Files.write() quando quiser a forma mais curta da biblioteca padrão e não precisar do controle de fluxo aberto do FileOutputStream.

Grave um array de bytes com o Apache Commons IO

Projetos que já dependem do Apache Commons IO podem chamar FileUtils.writeByteArrayToFile() em vez disso. Declare as coordenadas Maven commons-io:commons-io com a versão que a sua build fixa — a versão original deste artigo mostrava 2.6, que é uma versão de exemplo fornecida e não uma recomendação atual, portanto verifique a linha de versão que você pretende usar.

Com org.apache.commons.io.FileUtils importado, a chamada é FileUtils.writeByteArrayToFile(new File("doc.txt"), data), onde data é qualquer byte[], como "text".getBytes(StandardCharsets.UTF_8). O método cria o arquivo de destino quando ele está ausente, cria os diretórios pai ausentes no caminho — uma etapa que o Files.write() não executa — e trunca um arquivo existente antes de gravar. Ele também gerencia o fluxo internamente, portanto nenhum identificador fica para o chamador fechar. Como a classe vive em um jar de terceiros, este trecho é mostrado como código-fonte e não como um exemplo executável; para código novo sem a dependência, o Files.write() cobre a mesma tarefa em uma linha.