Ler e escrever fluxo de dados

5 respostas
ganondorfan

Boa tarde pessoal,

Eu gostaria de saber como ler um arquivo byte a byte, e escrevê-lo novamente no disco.
Eu estava tentando com o FileInputStream, entretanto não estou conseguindo trabalhar com ele.

So pra esclarecer, não quero ler caracteres, nem salvar um arquivo de texto, quero poder ler qualquer fluxo de dados e salva-lo novamente no disco.

Att. Paulo

5 Respostas

A

Acho que fiz isso quando fiz o FJ-11 da Caelum. Dê uma olhadinha no e-book que é free disponibilizado no site.

ganondorfan

Não consigo baixar o PDF, sera que é só comigo isso?

ganondorfan

Bom a respeito da apostila da Caelum , realmente muito formulada, embora meu problema não seja abordado diretamente lá.

O meu codigo segue abaixo:

public class leitora {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String caminho="c:/";
		File arquivo = new File(caminho);
		if(arquivo.isDirectory()){
			String[] lista = arquivo.list();
			int cont=0;
			for(String a: lista){
				
				System.out.println(a+" "+cont);
				cont++;
				
			}
			caminho+=lista[4];
			System.out.print(caminho);
			try {
				FileInputStream fluxo = new FileInputStream(caminho);
				byte[] bytes = new byte[1024];
				try {
					fluxo.read(bytes);
					File novo = new File("C:/novo.jpg");
					FileOutputStream escritor= new FileOutputStream(novo);
					escritor.write(bytes);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				
			
		}

	}

Ele quase funciona, no caso do teste o arquivo é uma imagem, porem a imagem é salva pela metade.
Será que o problema é o tamanho do meu vetor de bytes?
Como descobrir o tamanho em bytes antes de salvar?

A
try {
        DataInputStream in = new DataInputStream(new BufferedInputStream(
            new FileInputStream("conteudo.txt")));
        
        while (in.available() != 0)
            System.out.print((char) in.readByte());
    } 
    catch (IOException e){
        // possiveis erros são tratatos aqui
    }

tenta isso ai cara... DataInputStream pra leitura DataOutPutStream pra escrita.. se não me engano é essa parte da I/O que trabalha com byte

espero ter ajudado

Djonatah

eu vejo dois problemas no exemplo que vc passou:

  1. o arquivo de escrita não foi fechado
  2. o arquivo de imagem (que está sendo lido) tem mais de 1024 bytes.

Geralmente a leitura de uma stream é realizado dentro de um laço de repetição. Baseado no retorno do método read() (que retorna a qtde de bytes lidos ou -1 quando o fim do arquivo foi encontrado) é que se sabe quando se chega ao fim do arquivo. Então eu faria algo como:

int bytesLidos = 0
byte[] bytes = new byte[1024];  

while( bytesLidos > -1){
bytesLidos = fluxo.read(bytes);  
escritor.write(bytes, 0, bytesLidos);   // nem sempre todo o conteúdo do array deve ser salvo
}
...
escritor.close();

Não testei o código, mas deve funcionar…

Criado 10 de setembro de 2010
Ultima resposta 10 de set. de 2010
Respostas 5
Participantes 4