15 de out de 2012

Copiando arquivos Java





Sempre que buscamos formas de ler arquivos em Java nos deparamos com questões de performace ou facilidade de se fazer. Este artigo mostra uma evolução das formas de realizar esta copia, e ao final uma comparação entre os três métodos.



Em um passado não muito distante, a biblioteca java.io era utilizada para leitura e escrita em arquivo, após uma evolução java.nio passou a ser utilizada, e com a evolução do Java 7 as bibliotecas do java.nio 2 entraram na briga.   Com o intuito de testá-las foi utilizado um arquivo de texto de 205 Mb, o motivo deste tamanho é totalmente aleatório. Como IDE foi utilizado o JBossStudio e como JVM utilizei open JDK 6 e 7. A comparação foi feita realizando uma cópia do mesmo para um outro arquivo.


Java IO

 Para copiar o arquivo utilizando esta biblioteca foi utilizado o BufferedReader e o BufferedWriter.

O código utilizado segue abaixo :

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class JavaIo {
    public static final String pathIn = "/home/diego/arquivoEntrada";
    public static final String pathOut = "/home/diego/arquivoSaida";
    
    
    public static void main (String args []){

        BufferedReader br = null;
        BufferedWriter wr = null;

        Long ini = new Date().getTime();
        try {

            String sCurrentLine;
        
            br = new BufferedReader(new FileReader(pathIn));
            wr = new BufferedWriter(new FileWriter(pathOut));
            
            while ((sCurrentLine = br.readLine()) != null) {
                wr.write(sCurrentLine);
            }

            wr.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        Long f = new Date().getTime();
        System.out.println(f-ini);
        
    }
}



Java NIO

Para realizar esta copia utilizei o seguinte código:

package testes;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Date;

public class JavaNio {

    public static void main (String args[]){
        
        FileInputStream fin;
        try {
            Long ini = new Date().getTime();
            fin = new FileInputStream(JavaIo.pathIn);
            FileOutputStream fout = new FileOutputStream(JavaIo.pathOut);  
            FileChannel in = fin.getChannel();  
            FileChannel out = fout.getChannel();  
            long numbytes = in.size();            
            in.transferTo(0, numbytes, out);
            Long f = new Date().getTime();
            System.out.println(f-ini);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        
        
        
    }
}



Java NIO2

Para auxiliar na copia utilizei uma função nativa existente nesta versão que facilitou muito as coisas:


package testes;

import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.Date;

public class JavaNio2 {

    public static final String pathIn = "/home/diego/arquivoEntrada";
    public static final String pathOut = "/home/diego/arquivoSaida";
    
    public static void main(String args[]) {
        
        Path pathI =Paths.get(pathIn);
        Path pathO =Paths.get(pathOut);
        
         try {
            Long ini = new Date().getTime();
            Files.copy(pathI, pathO, StandardCopyOption.REPLACE_EXISTING);
            Long f = new Date().getTime();
            System.out.println(f-ini);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
  
    }
}



Resultados

Ao final dos testes o seguinte resultado foi obtido:

 

Biblioteca            Tempo ms
Java IO 6384
Java NIO 3190
Java NIO 2 1588




































































































































2 comentários: