1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro ao imprimir a frequência com que cada byte ocorre no arquivo

Pessoal, boa tarde!!! Estou com um problema no meu código que copia um arquivo no outro byte a byte e imprime a frequência com que cada byte ocorre em um arquivo. Ele não copia o arquivo todo e está dando o seguinte erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 512 at CopiaArquivos.copiar(CopiaArquivos.java:58) at CopiaArquivos.main(CopiaArquivos.java:23)

E o código é esse a seguir:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopiaArquivos {

    final static long startTime = System.nanoTime();

    public static void main(String[] args) throws FileNotFoundException {

        if(args.length != 2){
              System.err.println("Informe apenas um argumento");
              System.err.println("java Leia <nome_de_arquivo_origem> "
                      + "<nome_de_arquivo_destino>");
              System.exit(1);
        }

        FileInputStream fin = new FileInputStream(args[0]);
        FileOutputStream fout = new FileOutputStream(args[1]);

        try {
            copiar(fin, fout);
        } catch (IOException e) {
            e.printStackTrace();
        }      
    }

    public static void copiar(FileInputStream fin, FileOutputStream fout) throws IOException {

        FileInputStream entrada = fin;
        FileOutputStream saida = fout;           

        // Transferindo bytes de entrada para saída
        byte[] buffer = new byte[512];
        int n = 0;
        int aux, contador = 1, i, j;        

        while ((n = entrada.read(buffer)) > 0) {        
            for (i = 0; i < n; i++) {
                System.out.println("O byte #" + i + " é = " + buffer[i]);
            }
            saida.write(buffer, 0, n);

        /* Ordenando o vetor antes da contagem de repetições dos elementos */   
        for(i = 0; i < n; i++){
                for(j = 0; j < n - 1; j++){
                    if(buffer[j] > buffer[j+1]){
                        aux = buffer[j];
                        buffer[j] = buffer[j+1];
                        buffer[j+1] = (byte) aux;
                    }
                }            
            }

            /* Contando as repetições dos elementos inscritos no vetor */
            for(i = 0; i < n; i++){
                if (buffer[i] == buffer[i+1])
                    contador++;
                else{
                    System.out.println("O byte #" + i + " aparece " 
                            + contador + " vezes"); 
                    contador = 1;
                }
            }
        }        

        entrada.close();
        saida.close();   

        final long estimatedTime = System.nanoTime() - startTime;
        System.out.println("Tempo gasto: " + estimatedTime + " nanosegundos");
    }
}

Se puderem me ajudar eu agradeço, pois já tentei inúmeras vezes e não consegui corrigir o erro.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java arquivos java8 ou faça a sua própria pergunta.