Transmissao de Arquivos

Estou tentando transmitir um arquivo entre dois hosts via Sockets, sendo que compacto a stream com GZIPOutputStream/GZIPInputStream para diminuir o trafego (estou trasmitindo via Internet). Se transmito arquivos de texto plano funciona 100%, se transmito arquivos binarios ele troca varios caracteres p ex. Ï por 9, Ä por }, ê por ã, corrompendo totalmente o arquivo. Se alguem puder ajudar ficaria muito grato.
Segue o codigo dos dois programas:

import java.io.*;
import java.util.zip.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Simp {
	public static void main(String[] args) throws IOException {
		String nomearq = new String("");
		String destino = new String("");

		ServerSocket serv = null;

		Socket s = null;
		BufferedReader entrada = null;
		serv = new ServerSocket(7000);
		System.out.println("Aguardando transmissao... ");
		s = serv.accept();
		BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(s.getInputStream())));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream( "d:\temp\teste.txt" ));		
		int c;
		while ((c = in.read()) != -1) {
			out.write(c);
		}		
		s.close();
		serv.close();
		out.close();
	}
}

import java.io.*;
import java.util.zip.*;
import java.net.Socket;

// uso: java Tr <arquivo> <endereco ip destino>
public class Tr {
	public static void main(String[] args) throws IOException {

		Socket s = null;
		s = new Socket(args[1], 7000);

		BufferedReader in = new BufferedReader(new FileReader(args[0]));
		BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(s.getOutputStream()));
		int c;
		while ((c = in.read()) != -1) {
			out.write(c);
		}
		in.close();
		out.close();
		s.close();
	}
}

use bytes ao inves de int

kra, fiz isso agora, para arquivos binário eu uso:

   FileInputStream fis = new FileInputStream( new File( "<nome do arquivo>" ) );
      
   OutputStream out = new FileOutputStream( new File( "<caminho da cópia" ) );
   byte b[] = new byte[ 1024 ];
   int nBytes; 
   while ( ( nBytes = fis.read( b ) ) != -1 )
      out.write( b, 0, nBytes );
   out.flush();
   out.close();

Deu certinho!!! :smiley:

Tinha pegado o exemplo do livro “Thinking in Java” e lá o autor usava int.

Obrigado pela ajuda pessoal.

Outro problema que voce pode ter aqui eh com os java.io.Readers. Dando uma olhadda nos JavaDocs, vc vai ver que eles devem ser usados apenas para texto, e nao para conteudo binario. Para este ultimo, usa-se os java.io.Streams :slight_smile: