Quebrar arquivo

Ai galera tenho o codigo abaixo que transfere direitinho o arquivo para o servidor. To com uma dúvida oq ue eu tenho que alterar e implementar para conseguir transferir esse arquivo em partes tipo 50 em 50 bytes ?

Abraços

Cliente.java

[code]
import java.net.;
import java.io.
;
import java.io.File;

public class Client {
public static void main(String a[]) {
int c;
Socket cltskt=null;
PrintWriter writeskt=null;
File f = new File("c:/TesteClient.txt");
try {
FileInputStream fin = new FileInputStream(f.getAbsolutePath());
try {
cltskt=new Socket("127.0.0.1",4001);
System.out.println(cltskt);
}
catch(Exception e) { e.printStackTrace(); }
try {
writeskt=new PrintWriter(cltskt.getOutputStream(),true);
BufferedReader readskt = new BufferedReader(new InputStreamReader(cltskt.getInputStream()));
while((c = fin.read()) != -1) {
writeskt.println©;//to write to the socket
//System.out.print(Integer.parseInt(readskt.readLine()));

		       }
          } catch(Exception e) {e.printStackTrace();  }
		  try	{
			    fin.close();
		  }catch(IOException e) {}
	  }catch(FileNotFoundException e)	{ }

 }

}[/code]

Servidor.java

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server
{
     public static void main(String a[])
     {
          ServerSocket serskt=null;
          PrintWriter writeskt=null;
		  int rep;
		  try	{
			  FileOutputStream fout = new FileOutputStream("c:/TesteServer.txt");
			  try   {				  
				    serskt=new ServerSocket(4001);		
                    System.out.println("Socket preparado .......\n");
	          }
	          catch(Exception e) { e.printStackTrace();         }
	          try    {
	        	  System.out.println("Aguardando conexão ...\n"); 
	        	  Socket listen=serskt.accept();
	        	  System.out.println("Uma Conexão foi realizada ...\n");
		          writeskt=new PrintWriter(listen.getOutputStream(),true);
			      BufferedReader readskt = new BufferedReader(new InputStreamReader(listen.getInputStream()));
				   System.out.println("Transferindo arquivo ...\n");
				   try	{
					   		while((rep = Integer.parseInt(readskt.readLine())) != -1)	{
    		               	//System.out.print(rep);
    		               	fout.write(rep);
					        writeskt.println(rep); 
					 }
					   fout.close();
				   } catch(IOException e){}
					   writeskt.close();
		    			   readskt.close();
              }   catch(Exception e) {	System.out.println(e); e.printStackTrace();        }
	     }catch(FileNotFoundException e){}
     }
}

Comecei a fazer um teste,desculpa se coloquei coisas demais, mas a intenção é ir tentar fazendo depois aprimorando.
Bem o codigo abaixo mostra direitinho em quantas partes quebra, lá no for ele vai por exemplo de um arquivo de 169 bytes, ele mostra:

Transferindo de 0 a 50
transferindo de 51 a 101
transferindo de 52 a 151
Trasnferindo de 151 a 169

Estou indo para o caminho certo ???
Parece que so falta trasnferir a partir desses limitadores, enfim preciso de ajuda e dicas.

Codigo que imprimi o descrito acima abaixo:

Client2.java


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
 
public class Client	{
     public static void main(String a[])     {
    	  boolean sobrou=false;
    	  int result;
          Socket socket = null;
          PrintWriter escrevre = null;
		  File arquivo = new File("c:/TesteClient.txt"); //O arquivo :)		  
		  long tamanhoArquivo = 0; //Tamanho do arquivo que será armazenado posteriormente
		  long tamanhoMaximo = 50; // Tamanho máximo do arquivo a ser enviado ( em bytes )
		  long numPartes = 0; //Número de partes em que o arquivo poderá ser quebrado
		  long etapas = 1; //Número de etapas = numero de partes
		  int ultimaParte = 0 , //Caso a ultima parte do arquivo seja menor que 50 armazena o total a ser enviado
		  inicio = 0,fim = 0; //Inicio e final da leitura do arquivo
		  
		  try	{
			  //Abrimos um FileInputStream para o arquivo 
			  FileInputStream fin = new FileInputStream(arquivo.getAbsolutePath());			  
		      try    {			       
				   socket = new Socket("127.0.0.1",4001);
				   //debugs
	               System.out.println("Conectado....");		           		           
			  }
	          catch(Exception e)  {  e.printStackTrace();  }
		      try  {		    	  
		    	  //Cria uma instancia para enviarmos o arquivo para o destino.
		    	  //O parametro tru indica que o arquivo será enviado a cada println
		    	  escrevre = new PrintWriter(socket.getOutputStream(),true);
		    	  
		    	  //BufferedReader readskt = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    	  //Pega o tamanho do arquivo
				   tamanhoArquivo = fin.getChannel().size();				   
				   //Debugs
		    	   System.out.println("O arquivo possui tamanho de " + tamanhoArquivo + " bytes.");
		    	   //Calcula em quantas partes o arquivo poderá ser dividido.
		    	   numPartes = tamanhoArquivo/tamanhoMaximo;// + (tamanhoArquivo % tamanhoMaximo == 0 ? 0 : 1  ) ;
		    	   //Se o resto da divisão não for 0 incrementa mais um, armazena o resto que sobrou 
		    	   //para chegar no tamanhoMaximo e coloca true na variável que verifica se sobrou resultado.
		    	   if( !(tamanhoArquivo % tamanhoMaximo == 0)  ) {
		    		   numPartes++;
		    		   sobrou = true;		    		   
		    		   ultimaParte = (int) (tamanhoArquivo % tamanhoMaximo);
		    	   }		    	   
		    	   //Debugs
		    	   System.out.println("O arquivo pode ser quebrado em "+ numPartes + " partes.");
				   System.out.println("Arquivo sendo transferido em "+numPartes+" etapas ...");				   				   
				   for( int i = 1 ;  i &lt= numPartes ; i++)   {					 
					   
					  System.out.println("Etapa "+i);					   
					 // Se  for a primeira Etapa e sobrou true
					 if( i==1 && i<numPartes ) {						 	
							 fim = (int) tamanhoMaximo;
							 }
					 //Se não for a primeira Etapa e sobrou false
					 if( i>1 && i<numPartes ) {						
						 inicio = inicio + (int) tamanhoMaximo + 1;
						 fim = fim + (int) tamanhoMaximo + 1;
					 } 
					 //Se não for a primeira Etapa e sobrou true
					 else if( i>1 && i==numPartes && sobrou ) {						 
							 inicio = inicio + (int) tamanhoMaximo + 1;
							 fim = (int) tamanhoArquivo;							 
						 }					 
					 
					 System.out.println("Transferindo Inicio: " + inicio + " bytes Fim: "+fim+" bytes");
					 //result = fin.read(bytesParte, inicio, fim);//Le o arquivo		 			  	                     
		 			 //System.out.println(Integer.toString(result, 2));		 			 
				   }
				   /*while((result = fin.read()) != -1)   {
			 			 escrevre.println(result);//to write to the socket 	                     
			 			 System.out.println(Integer.toString(result, 2));
				   }*/
	          } catch(Exception e) {e.printStackTrace();  }
			  try	{
				    fin.close();
			  }catch(IOException e) {}
		  }catch(FileNotFoundException e)	{ }
   
     }    
}

Realmente esse teu codigo tá longo e não li tudo. Mas reparei duas coisas:

  • Vc tá usando PrintWriter e tal, teu arquivo é de texto ?
  • Vc tá passando tudo byte a byte com o método write(byte b) , se que mandar em blocos use o write(byte[] b).

[quote=ciczan]Realmente esse teu codigo tá longo e não li tudo. Mas reparei duas coisas:

  • Vc tá usando PrintWriter e tal, teu arquivo é de texto ?
  • Vc tá passando tudo byte a byte com o método write(byte b) , se que mandar em blocos use o write(byte[] b).[/quote]

Sim é um arquivo texto … vou tentar com write(byte[] b)
So não to sabendo como quebrar ele e mandar de 50 em 50 bytes

Ai pessoal bom tomara q alguem me ajude a testar e ver oq ue psoso mudar. A principio consegui, o codigo ficou meio tosco mas nao da nada.

É para trasnferir de 50 em 50 bytes um arquivo .txt para um servidor.

segue os codigos, compilem e rodem e me deem dicas, mas a principio acho que funcionou, estou transferindo de 50 em 50 correto ? Pelo meu for a partir dos calculos realizados ?

Criem claro o arquivo no c:/TesteClient.txt ou mudem no codigo e criem outro :slight_smile:

Valeu

Client.java


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
 
public class Client	{
     public static void main(String a[])     {
    	  boolean sobrou=false;
    	  int result;
          Socket socket = null;
          PrintWriter escrevre = null;
		  File arquivo = new File("c:/TesteClient.txt"); //O arquivo :)		  
		  long tamanhoArquivo = 0; //Tamanho do arquivo que será armazenado posteriormente
		  long tamanhoMaximo = 50; // Tamanho máximo do arquivo a ser enviado ( em bytes )
		  long numPartes = 0; //Número de partes em que o arquivo poderá ser quebrado		  
		  int inicio = 0,fim = 0; //Inicio e final da leitura do arquivo
		  
		  try	{
			  //Abrimos um FileInputStream para o arquivo 
			  FileInputStream fin = new FileInputStream(arquivo.getAbsolutePath());			  
		      try    {			       
				   socket = new Socket("127.0.0.1",4001);
				   //debugs
	               System.out.println("Conectado....");		           		           
			  }
	          catch(Exception e)  {  e.printStackTrace();  }
		      try  {		    	  
		    	  //Cria uma instancia para enviarmos o arquivo para o destino.
		    	  //O parametro true indica que o arquivo será enviado a cada println
		    	  escrevre = new PrintWriter(socket.getOutputStream(),true);		    	  
		    	  //Pega o tamanho do arquivo
				  tamanhoArquivo = fin.getChannel().size();				  
				  //Debugs
		    	  System.out.println("O arquivo possui tamanho de " + tamanhoArquivo + " bytes.");
		    	  //Calcula em quantas partes o arquivo poderá ser dividido.
		    	  numPartes = tamanhoArquivo/tamanhoMaximo;// + (tamanhoArquivo % tamanhoMaximo == 0 ? 0 : 1  ) ;
		    	  //Se o resto da divisão não for 0 incrementa mais um, armazena o resto que sobrou 
		    	  //para chegar no tamanhoMaximo e coloca true na variável que verifica se sobrou resultado.
		    	  if( !(tamanhoArquivo % tamanhoMaximo == 0)  ) {
		    		  numPartes++;
		    		  sobrou = true;		    		   
		    	  }		    	   
		    	   //Debugs
		    	   System.out.println("O arquivo pode ser quebrado em "+ numPartes + " partes.");
				   System.out.println("Arquivo sendo transferido em "+numPartes+" etapas ...");				   
				   for( int i = 1 ;  i &lt= numPartes ; i++)   {					   
					  System.out.println("Etapa "+i);					   
					 // Se  for a primeira Etapa e sobrou true
					 if( i==1 && i&lt=numPartes ) {						 
						 if (tamanhoArquivo &gt= tamanhoMaximo)
							 fim = (int) tamanhoMaximo;
			                else
			                 fim = (int)tamanhoArquivo;						 
					 }
					 //Se não for a primeira Etapa e sobrou false
					 if( i&gt1 && i<numPartes ) {						
						 inicio = inicio + (int) tamanhoMaximo + 1;
						 fim = fim + (int) tamanhoMaximo + 1;
					 } 
					 //Se não for a primeira Etapa e sobrou true
					 else if( i>1 && i==numPartes && sobrou ) {						 
							 inicio = inicio + (int) tamanhoMaximo + 1;
							 fim = (int) tamanhoArquivo;							 
						  }					 
					 System.out.println("Transferindo Inicio: " + inicio + " bytes Fim: "+fim+" bytes");					 
					 
					 for(int x = inicio ; x &lt fim ; x++ ) {						
						 result = fin.read();//Le o arquivo		 			  	
						 escrevre.println(result); //Grava no destino						
					 }
		 			 //System.out.println(Integer.toString(result, 2)); // BINARIO		 			 
				   }				   
	          } catch(Exception e) {e.printStackTrace();  }
			  try	{
				    fin.close();
			  }catch(IOException e) {}
		  }catch(FileNotFoundException e)	{ }
   
     }    
}

Server.java

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server
{
     public static void main(String a[])
     {
          ServerSocket serskt=null;
          PrintWriter writeskt=null;
		  int rep;
		  try	{
			  FileOutputStream fout = new FileOutputStream("c:/TesteServer.txt");
			  try   {				  
				    serskt=new ServerSocket(4001);		
                    System.out.println("Socket preparado .......\n");
	          }
	          catch(Exception e) { e.printStackTrace();         }
	          try    {
	        	  System.out.println("Aguardando conexão ...\n"); 
	        	  Socket listen=serskt.accept();
	        	  System.out.println("Uma Conexão foi realizada ...\n");
		          writeskt = new PrintWriter(listen.getOutputStream(),true);
			      BufferedReader readskt = new BufferedReader(new InputStreamReader(listen.getInputStream()));
				   System.out.println("Transferindo arquivo ...\n");
				   try	{
					   while((rep = Integer.parseInt(readskt.readLine())) != -1)	{
	               			 //System.out.print(rep);
	               			 fout.write(rep);
	               			 writeskt.println(rep);
					   }
					   fout.close();
				   } catch(IOException e){}
					   writeskt.close();
		    			   readskt.close();
              }   catch(Exception e) {	System.out.println(e); e.printStackTrace();        }
	     }catch(FileNotFoundException e){}
     }
}

[]´s

blz fsjr!!!

estou testando seu código aqui e me parecer rodar perfeitamente , mais eu queria saber , como eu faço pra mim enviar um arquivo de cliente para cliente isso é possível???

ficarei grato c puder me ajudar
vlw

ouw ja conssegui vlw , há olha só , ele não ta transferindo todo o arquivo c ele for pequeno , vou ver c faço umas modificações e c der certo eu te falo blz…

Não esqueça do método flush() para esvaziar o buffer e de close() para fechar a conexão no final. Talvez por isso que arquivos pequenos não tão indo.

Galera sei que o topico é antigo e talvez vocês nem lembrem como faz isso mais srrsrs
Mas preciso da ajuda de vocês, creio que seja uma falta de entendimento mesmo com as classes e os métodos, mas vamos lá.
Preciso transferir um arquivo da maquina do cliente para o FTP. Acontece que para transferir um arquivo de 2 MB ocorre uma tremenda demora, de quase 10 min. Estava vendo a função de dividir os arquivos em bytes, mas não sei bem aonde implementar esta parte de código na minha classe, estou apanhando muito srrs.
Sou novo em java, por isso tenho este tipo de duvidas ! Segue abaixo minha classe com a parte dos bytes.
Desculpem pela incompreensão ! Talvez minha pergunta seja ridícula.

[code]public class ClienteFTP {

private String servidor = "Francatalogos FTP";  
FTPClient ftp = new FTPClient();  
FTPClientConfig config = new FTPClientConfig();  

public void inicia(String localArquivo, String nomePasta, String nomeArquivo) {  

    ftp.configure(config);  

    try {  
        int responder;  
        //Conecta e loga no FTP  

        ftp.connect("ftp.francatalogos.com.br");  
        ftp.login("francatalogos", "mh240970");  
        System.out.print(ftp.getReplyString());  
        responder = ftp.getReplyCode();  

        ftp.enterLocalPassiveMode();  
        ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);  
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  

        byte[] divisao = new byte[1024];  
        int i = 0;  
        //Obtem o local do arquivo   
        FileInputStream file = new FileInputStream(localArquivo);  


        while ((i = file.read(divisao)) > -1) {  
            for (int j = 0; j < i; j++) {                // este é a parte do método que encontrei para fazer a conversão dos bytes, devo implementar o codigo abaixo aqui dentro ?  
            }  
        }  

        //Verifica se o caminho/pasta existe.  
        boolean isDirectory = ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);  
        if (!isDirectory) {  
            //se não existir cria a pasta  
            ftp.makeDirectory("T&TSistemas/" + nomePasta);  
        }  
        ftp.changeWorkingDirectory("T&TSistemas/" + nomePasta);  

        File f = new File(localArquivo);  
        nomeArquivo = f.getName();  

        salvaArquivo(nomeArquivo, file);  

        if (!FTPReply.isPositiveCompletion(responder)) {  
            ftp.disconnect();  
            JOptionPane.showMessageDialog(null, "Não foi possível conectar a " + servidor + ".");  
            System.exit(1);  
        }  

        ftp.logout();  
    } catch (IOException io) {  
        io.printStackTrace();  
        JOptionPane.showMessageDialog(null, "Erro ServidorFTP" + io);  
    } finally {  
        if (ftp.isConnected()) {  
            try {  
                ftp.disconnect();  
                System.out.println("Desconectado !");  
            } catch (IOException io) {  
            }  
        }  
    }  
}  

private void salvaArquivo(String nomeArquivo, FileInputStream file) throws IOException {  
    //Verifica se o arquivo foi salvo(storeFile).  
    if (ftp.storeFile(nomeArquivo, file)) {  
        JOptionPane.showMessageDialog(null, "Arquivo armazenado com sucesso.");  
    } else {  
        JOptionPane.showMessageDialog(null, "Não foi possível armazenar o arquivo.");  
        ftp.logout();  
        ftp.disconnect();  
    }  
}  

} [/code]