FileOutputStream
- 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
- 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);
- Liberação de recursos
- Após o uso, é essancial liberar recursos para liberar o arquivo
FileInputStream
- 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
- 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
- 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.