Andre,

        n�o � necess�rio utilizar as classes "Buffered". O c�digo abaixo
utiliza as classes FileReader e FileWriter, que s�o subclasses de
InputStreamReader e OutputStreamReader respectivamente, logo, voc� pode
utilizar estas �ltimas nas suas classes que trabalham com Sockets usando o
getInputStream e o getOutputStream. Preste aten��o no m�todo write que grava
apenas parte do array de 10000, talvez a� esteja o seu problema.

Roger Steuernagel

Microsoft Certified Professional
Sun Certified Java Programmer
Technical Support Analyst
Technology Center @ Datasul

import java.io.*;

public class Teste {

        public static void main (String [] args) {
                Teste t = new Teste();          
        }
        
        Teste () {
                
                try {
                        FileReader fr = new
FileReader("c:\\winnt\\notepad.exe");
                        FileWriter fw = new FileWriter("c:\\tmp\\note.exe");
                        
                        char [] aux = new char[10000]; // Tamanho do buffer
                        int ret;
                        while (true) {
                                ret = fr.read(aux,0,10000); // Quantidade de
bytes lidos (ret)
                                if (ret == -1)
                                        break;
                                fw.write(aux,0,ret); // Grava apenas o
n�mero de bytes lidos (ret)
                        }
                        
                        fr.close();
                        fw.close();
                }
                catch (IOException e) {
                        e.printStackTrace();
                }
                
        }

}

> -----Original Message-----
> From: Simone Freire [SMTP:[EMAIL PROTECTED]]
> Sent: Ter�a-feira, 2 de Fevereiro de 1999 09:55
> To:   [EMAIL PROTECTED]
> Subject:      Transferencia de arquivos via Socket e BufferedInputStream
> 
> Srs e Sras, Saudacoes.
> Estive afastado, de ferias, por uns tempos, mas
> agora estou de volta, e trouxe um pequeno problema.
> Estou finalizando dois softwares, um cliente e um 
> servidor de chat, em java, e estou iniciando implementacao da rotina
> de transferencia de arquivos,
> cliente a cliente, via Socket e ServerSocket.
> 
> Na minha rotina de teste, defino o arquivo com File e
> o abro para leitura com FileInputStream, para leitura byte a byte,
> repassando os bytes lidos para Socket.getOutputStream(), via
> BufferedOutputStream. No outro lado da conexao, capturo os bytes com
> Socket.getInputStream(), via BufferedInputStream. Funciona beleza
> quando nao estou buferizando a leitura do arquivo no cliente de
> origem, ou seja, leio um byte,transmito um byte, e assim
> sucessivamente, so que fica lento, apesar de nao ocorrer degradacao
> dos dados.
> 
> Para encurtar o tempo de leitura, envolvi o FileInputStream, na
> leitura do arquivo de origem, com
> BufferedInputStream, e usei o metodo
> read(byte[] b, int offset, int count) de BufferedInputStream para ler
> os bytes, definindo b como um buffer de 100 bytes, offset em 0 e count
> em 100, como em read(b,0,100). Ficou super rapido. So que degradou o
> arquivo, ou seja, o arquivo de destino sempre fica maior que o de
> origem. Como exemplo, defini a origem como sendo o Notepad.exe. Apos
> gerado o destino, este nao executa de forma alguma, pois esta
> corrompido. Analisei o codigo e reduzi o buffer para 4 bytes. Funciona
> sem problema. Aumentei o buffer para 5 bytes. Come�a a corromper o
> arquivo. Nao consegui entender. Sera algum bug? Segue abaixo os
> codigos dos 
> arquivos Main.java e Transf.java, cliente e servidor de sockets,
> respectivamente. Em Main.java tem umas quatro linhas desabilitadas,
> relativas a um gauge de progresso, que desabilitei pois a classe ainda
> nao esta pronta.
> 
> Para testar Main.class e Transf.class, colocar os dois arquivos num
> mesmo diretorio junto com uma copia do notepad.exe(que so serve para
> teste, pode ser outro arquivo, desde que seja alterado o parametro de
> File em 
> Main.java). Executar Transf.class, com o comando 
> java Transf  e depois executar Main.class, que eh so
> uma janela de teste,com um botao que realiza a conexao e inicia a
> transferencia, tudo bem primario, pois eh so teste.
> 
> Desculpem o "jornal" acima, mas procurei descrever bem o problema.
> Conto com a ajuda de voces.
> Andre.
> 
> Codigo do Main.java
> -------------------
> 
> import java.awt.*;
> import java.io.*;
> import java.awt.event.*;
> import java.net.*;
> 
> public class Main extends Frame implements ActionListener {
>       Gauge g;
>       Label l1;
>       public Main() {
>               super.setTitle("Teste de transferencia de arquivo");
>               setSize(300,300);
>               setLayout(new FlowLayout(FlowLayout.CENTER));
>               Button b1=new Button("Transfere");
>               add(b1);
>               //g=new Gauge();
>               //add(g);
>               l1=new Label("         ");
>               add(l1);
>               b1.addActionListener(this);
>               Dimension d=getToolkit().getScreenSize();
>               setLocation((d.width-getSize().width)/2,
>                       (d.height-getSize().height)/2);
>               setVisible(true);
>       }
>       
>       public void actionPerformed(ActionEvent evt)  {
>               try {
>                 Socket s=new Socket("127.0.0.1",5500);
>                       File f=new File("notepad.exe");
>                       //g.setMaxValue(f.length());
>                       FileInputStream fi=new FileInputStream(f);
>                       BufferedInputStream bi=new BufferedInputStream(fi);
>                       int c;
>                       int nrBytes=0;
>                       byte[] b=new byte[4];
>                       BufferedOutputStream bOut=
>                               new
> BufferedOutputStream(s.getOutputStream());
>                       while ((c=bi.read(b,0,4))!=-1) {
>                               //System.out.println(c);
>                               bOut.write(b);
>                               bOut.flush();
>                               nrBytes+=c;
>       
> l1.setText(Integer.toString(nrBytes*100/(int)f.length()));
>                               //g.setPosition(nrBytes);
>                       
>                               
>                         
>                       }
>                       bOut.close();
>                       System.out.println("gravou");
>                               
>                       
>                       
>               }
>               catch (IOException e) {
>                       System.out.println("Houve erro de conexao");
>               }
>       }
>       
>       public static void main(String[] args) {
>               new Main();
>       }
> }
>       
> 
> 
> Codigo do Transf.java
> =====================
> 
> import java.net.*;
> import java.io.*;
> 
> public class Transf {
>       Socket s;
>       public Transf()  {
>               try {
>                 ServerSocket ss=new ServerSocket(5500);
>                 s=ss.accept();
>                 File f=new File("saida.exe");
>                 FileOutputStream fOut=
>                 new FileOutputStream(f);
>                 BufferedInputStream bi=new BufferedInputStream(
>                        s.getInputStream());
>                 int c;
>                       byte[] b=new byte[4];
>               
>                 while ((c=bi.read(b,0,4))!=-1) {
>                       
>                         fOut.write(b);
>                 }
>               }
>               catch (IOException e) {
>                       fecha();
>               }
>       }
>       
>       public void fecha() {
>               try {
>                       s.close();
>               }
>               catch (IOException e) {
>               }
>       }
>       
>       public static void main(String[] args) {
>               new Transf();
>               
>               
>       }
> }
>                       
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _________________________________________________________
> DO YOU YAHOO!?
> Get your free @yahoo.com address at http://mail.yahoo.com
> 
> * Para nao receber mais e-mails da lista, acesse
> <http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu
> e-mail, escolha a lista <[EMAIL PROTECTED]> e de um <submit>.
* Para nao receber mais e-mails da lista, acesse 
<http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu e-mail, escolha a 
lista <[EMAIL PROTECTED]> e de um <submit>.

Responder a