Fluxos de Bytes em Java: Entrada e Saída de Arquivos

FileOutputStream

  1. Criação do objeto de fluxo de saída de bytes: FileOutputStream fluxoSaida = new FileOutputStream()
  • O parâmetro pode ser um caminho em formato de string ou um objeto File (internamente, uma string é convertida em File)
  • Se o arquivo não existir, ele será criado, mas o caminho pai deve existir
  • Se o arquivo já existir, seu conteúdo será apagado. É possível adicionar um segundo parâmetro booleano para permitir anexar dados
  1. Escrita de dados: fluxoSaida.write(92)
  • Escreve um inteiro correspondente ao valor ASCII
  • Para escrever uma string de uma vez:
String texto = "Olá Mundo!"
byte bytesTexto[] = texto.getBytes();
fluxoSaida.write(bytesTexto);

  • É possível escrever um aray de bytes especificando a posição inicial e o comprimento
  • Para inserir uma nova linha:
String novaLinha = "\n"
byte bytesLinha[] = novaLinha.getBytes();
fluxoSaida.write(bytesLinha);

  1. Liberação de recursos
  • Após o uso, é essancial liberar recursos para liberar o arquivo

FileInputStream

  1. Criação do objeto de fluxo de entrada de bytes: FileInputStream fluxoEntrada = new FileInputStream()
  • Se o arquivo não existir, uma exceção será lançada
  1. Leitura de dados: fluxoEntrada.read()
  • Lê um byte de cada vez e o retorna
  • Cada leitura move o cursor para o próximo byte
  • Ao chegar ao final do arquivo, o método retorna -1
  1. Liberação de recursos

Exercício: Copiando arquivos com medição de tempo

package ExemplosJava;

import java.io.*;

public class CopiadorArquivo {
	public static void main(String[] args) throws IOException{
		File arquivoDestino = new File("./imagem_copiada.jpg");
		FileInputStream fluxoEntrada = new FileInputStream("C:\\Usuarios\\MeuPC\\Imagens\\original.jpg");
		FileOutputStream fluxoSaida = new FileOutputStream(arquivoDestino);
		int byteAtual = 0;
		long inicio = System.currentTimeMillis();
		while ((byteAtual = fluxoEntrada.read()) != -1) {
			fluxoSaida.write(byteAtual);
		}
		System.out.println("Cópia concluída");
		long fim = System.currentTimeMillis();
		System.out.println("Tempo total gasto: " + (fim - inicio) + " milissegundos");
		fluxoSaida.close();
		fluxoEntrada.close();
	}
}

O exemplo acima demonstra que a cópia byte por byte é extremamente lenta. Para melhorar o desempenho, podemos usar arrays de bytes com: int qtdeLida = fluxoSaida.read(buffer), onde buffer é um array de bytes. Este método lê dados do arquivo e tenta preencher o array completamente. Os dados lidos são sobrescritos a partir do início do array, e se não for completamente preenchido, os valores restantes permanecerão. O tamanho ideal do array é múltiplo de 1024.

Podemos utilizar o valor retornado, qtdeLida, que endica quantos bytes foram realmente lidos: System.out.println(new String(buffer,0,qtdeLida)); converte os bytes lidos em string para exibição.

Tags: java I/O FileOutputStream FileInputStream fluxos_de_bytes

Publicado em 6-30 04:45