Juntar arquivos

9 respostas
wanderley.drumond

Olá pessoal tenho um código que separa um arquivo em dois e os renomeia, mas não sei fazer o inverso, será que alguém me ajuda? Eis o código:

public class SeparaArquivos {
   public static void separa(File arquivo) throws IOException  {
       FileReader input = null;
       FileWriter output1 = null;
       FileWriter output2 = null;
       try {
           input = new FileReader(arquivo.getAbsolutePath());
           output1 = new FileWriter(System.getProperty("user.dir") + "//P1.jar");
           output2 = new FileWriter(System.getProperty("user.dir") + "//P2.enpt");
           long tamanho = arquivo.length();
           long indice = 0;
           boolean primeiro = true;
            
           while(indice < tamanho){
               int lido = input.read();
               if(primeiro)
                   output1.write(lido);
               else
                   output2.write(lido);
               primeiro = !primeiro;
               indice++;
           }
       } finally    {
           if (input != null)  {
               input.close();
           }
           if (output1 != null)    {
               output1.flush();
               output1.close();
           }
           if (output2 != null)    {
               output2.flush();
               output2.close();
           }
       }
   }
}

9 Respostas

peron

Seguindo a sua lógica, vc leria os 2 arquivos, (FileReaders) e escreveria a saida em um FileWriter…

Qual o problema?

sds

xan

qual a dificuldade amigo? na lógica ou na implementação do código?

a lógica é simples, assim como para separar, voce fez um FileReader e dois FileWriter
para juntar voce faz 2 FileReader e 1 FileWriter

agora voce pode escolher entre criar um novo arquivo texto com a junção desses 2
ou entao escrever ao fim do primeiro arquivo texto lido.

//pseudo-código método junta();
junta()
{
    arquivo1; //primeiro arquivo
    arquivo2; //segundo arquivo
    novoArquivo; //arquivo com a junçao
    linha1 = linha atual lida no arquivo1; //primeira linha do arquivo1
    enquanto(linha1 != null)
    {
        escreve linha1 em novoArquivo;
        linha1 = proxima linha no arquivo1;
    }
    
    linha2 = linha atual lida no arquivo2; //primeira linha do arquivo2
    enquanto(linha2 != null)
    {
        escreve linha2 em novoArquivo;
        linha2 = proxima linha no arquivo2;
    }
    fim;
}
wanderley.drumond

Certo, mas utilizando isso eu terei o arquivo original novamente?

peron

Ficaria algo assim:

public static void junta([]File entradas, File saida) throws IOException { FileReader input = null; FileWriter output = null; try { output = new FileWriter(saida); for(int i = 0; i < entradas.length(); i++) { input = new FileReader(entradas[i]); char chr; while((chr = inputs[i].read()) > 0) { output.write(chr); } input.close(); } } finally { if (input != null) { input.close(); } if (output != null) { output.flush(); output.close(); } } }

Saudações

xan

no caso voce teria um novo arquivo, como especificado na linha

novoArquivo; //arquivo com a junçao
wanderley.drumond

Mas eu separei um arquivo certo?
Agora quero juntar essas partes e transformá-lo no que ele era antes. é isso que quero saber como fazer.
Alguém saberia?

wanderley.drumond

Ah outra coisa pessoal, perceberam que eu estou renomeando os arquivos para “P1.jar” e “P2.enpt”?

Na verdade eu gostaria de concatenar esse nome com o nome original do arquivo.

Exemplo do que tenho:
Escolhi o arquivo data.doc
ao ser separado terei 2 arquivos P1.jar e P2.enpt

Exemplo do que quero:
Escolhi o arquivo data.doc
ao ser separado terei 2 arquivos dataP1.jar e dataP2.enpt

alguém saberia?

wanderley.drumond

Pessoal eu fiz isso, onde será que eu estou errando?

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;

/**
 *
 * @author Wanderley
 */
public class UneArquivos {
    
    /** Creates a new instance of UneArquivos */
    public static void junta(File arquivo) throws IOException {
       FileReader input1 = null;
       FileReader input2 = null;
       FileWriter output = null;
       
       try{
           input1 = new FileReader(arquivo.getAbsolutePath());
           input2 = new FileReader(arquivo.getAbsolutePath());
           output = new FileWriter(System.getProperty("user.dir") + "//P1.doc");
           
           long tamanho = arquivo.length();
           long indice = 0;
           boolean primeiro = true;
           
           while(indice < tamanho){
               int lido1 = input1.read();
               int lido2 = input2.read();
                   output.write(lido1 + lido2);
               primeiro = !primeiro;
               indice++;
       }
    }finally    {
           if (input1 != null)  {
               input1.close();
           }
           if (input2 != null)    {
               input2.close();
           }
           if (output != null)    {
               output.flush();
               output.close();
           }
       }
    JOptionPane.showMessageDialog(null, "Arquivo recuperado com sucesso:" + arquivo.getName());
    }
}
KWill

wanderley.drumond:
Pessoal eu fiz isso, onde será que eu estou errando?

Acho que nesse código aí você está usando dois FileReaders tentando ler do mesmo arquivo, o que poderia ocasionar erros de acesso, pois pode ser que apenas um dos FileReaders tenha permissão para obter o conteúdo do arquivo por vez. Assim, esse seu método junta(File arquivo) pode estar lançando exceção e caso esteja, veja se você posta o stacktrace da exceção que está sendo lançada.

Para "juntar" arquivos, eu sugeriria o uso de InputStream e OutputStream, que leêm e escrevem num "nível mais baixo", manipulando bytes.

Este trecho me parece loucura total:

# while(indice < tamanho){  
#                int lido1 = input1.read();  
#                int lido2 = input2.read();  
#                    output.write(lido1 + lido2);  
#                primeiro = !primeiro;  
#                indice++;  
#        }

Neste trecho, você está lendo 1 caractere de cada arquivo, depois escrevendo um caractere que seria o resultado da soma de ambos no arquivo final.
Tenho quase que certeza também que caso os arquivos que estão sendo lidos por input1 e input2 não tiverem o mesmo tamanho, alguma exceção será lançada nesse trecho.

"Juntar arquivos" seria escrever a partir do final de um arquivo o conteúdo de outro arquivo? Se for isso, esse código me parece longe de realizar tal feito.

Sugiro que você dê uma olhada na parte de I/O e streams do Java, procurando no fórum do GUJ e/ou no Google.

Inté.

Criado 2 de dezembro de 2007
Ultima resposta 3 de dez. de 2007
Respostas 9
Participantes 4