Exatamente!
O problema estava no nr de bytes gravados, ou seja,
no metodo write. Quando usei a forma com os tres
parametros, tudo funcionou legal.

Vou substituir as classes de stream de bytes pelas
streams de caracter e analisar se ha ganho de per-
formance.

Na verdade, sempre me limitei a usar as classes
___reader e ___writer ao ler e gravar arquivos-
textos. Funciona adequadamente tambem com arquivos
binarios?

Andre.







---Roger Steuernagel <[EMAIL PROTECTED]> wrote:
>
> 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];
> >             
> 
=== message truncated ===

_________________________________________________________
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>.

Responder a