Sunday, September 9, 2018

Eliminate file duplicate using guava in spring boot


File duplicate adalah dua atau lebih file yang memiliki kesamaan yang berada pada satu tempat. 
Jika file duplicate nya berjumlah puluhan atau bahkan ratusan, tentu akan mengakibatkan ruang penyimpanan atau kapasitas memory kita akan semakin sempit. Lantas, apa yang kita lakukan? Tentu kita harus menghapus file yang duplicate tersebut agar penyimpanan kita terasa ringan. 
Namun jika jumlahnya hingga ribuan atau ratus ribuan, kita mungkin tidak sanggup mencari file yang duplicate dan menghapus nya secara manual. 
Jangan bersedih dulu, disini kita akan membahas bagaimana cara eliminasi file duplicate dengan menggunakan spring boot. Dengan menggunakan spring-boot kita bisa dengan mudah eliminasi file duplicate dengan cepat dan mudah dengan bantuan library google guava. 
Nah google guava itu apa??
Google guava itu adalah library untuk java yang dibangun oleh engineer google. 

  • Pertama yang harus kita lakukan adalah create project baru spring-boot
  • Kemudian pada file pom.xml kita akan menambahkan library google guava

<dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>23.0</version>
</dependency>

  • Create 1 file java, dalam demo ini saya create FileDuplicator.java

    package drools.model;
    import com.google.common.base.Function;import com.google.common.base.Preconditions;import com.google.common.collect.*;import com.google.common.hash.HashCode;import com.google.common.hash.HashFunction;import com.google.common.hash.Hashing;import com.google.common.io.Files;import lombok.Data;
    import java.io.File;import java.io.IOException;import java.nio.file.Path;import java.util.*;

    public class FileDuplicator {
    File directory;
    FileDuplicator(String filePath){
      this.directory = new File(filePath);  Preconditions.checkState(this.directory.isDirectory(),   "Supplied directory does not exist "); }
    public Collection<FileDuplicate> calculateDuplicaties(){
      FluentIterable<FileDuplicator.FileRecord> records = Files.fileTreeTraverser()
      .breadthFirstTraversal(this.directory)
      .filter(File::isFile)
      .transform(FileDuplicator.FileRecord::new);  Multimap<HashCode, Path> duplicateCandidates = ArrayListMultimap.create();  records.forEach(fileRecord -> duplicateCandidates.put(fileRecord.getHashCode(),   fileRecord.getPath()));

      Multimap<HashCode, Path> dupesOnly = Multimaps.filterKeys(duplicateCandidates,   record -> duplicateCandidates.get(record).size() > 1);

      FluentIterable<FileDuplicator.FileDuplicate> fileDuplicates =
      FluentIterable.from(dupesOnly.asMap()
      .entrySet())
      .transformAndConcat((Function<Map.Entry<HashCode, Collection<Path>>,  Iterable<FileDuplicator.FileDuplicate>>)
       input -> Collections.singleton(new FileDuplicator
       .FileDuplicate(input.getKey(),  input.getValue())));

    return ImmutableSet.copyOf(fileDuplicates);
      }

    public static void
    main(String[] args) {
      FileDuplicator fileDuplicator = new FileDuplicator(
       "/Users/tamy/Documents/Belajar/Folder/");  Collection<FileDuplicator.FileDuplicate> duplicates =
       fileDuplicator.calculateDuplicaties();  System.out.println("\n duplicates : " +duplicates);  String a = "";
      for(FileDuplicator.FileDuplicate fileDuplicate : duplicates){
       Collection test = fileDuplicate.paths;  a = String.valueOf(test);  a = a.substring(a.lastIndexOf("[")+1,a.lastIndexOf("]"));// System.out.println("a : "+test.size());
      for
    (int j=0;j<test.size()-1;j++){
       String[] strArray = new String[] {a};// System.out.println("strArray : "+ strArray.length);   String[] split = strArray[0].split(",");// System.out.println("temps : "+split[j]);   recursiveDelete(new File((split[j].toString().trim())));  }

      }
    }

    public static void recursiveDelete(File file) {
    //to end the recursive loop  if (!file.exists())
       return;
    //if directory, go inside and call recursively  if (file.isDirectory()) {
       for (File f : file.listFiles()) {
    //call recursively   recursiveDelete(f);   }
      }
    //call delete to delete files and empty directory  file.delete();  System.out.println("Deleted file/folder: " +file.getAbsolutePath()); }

    static class FileDuplicate{
      HashCode hashCode;  Collection<Path> paths;
      FileDuplicate(HashCode hashCode, Collection<Path>paths){
       this.hashCode = hashCode;   this.paths = paths;  }
      @Override  public String toString(){
       return this.hashCode + "\n" + "\t" + this.paths +"\n";  }
    }

    @Data static class FileRecord{
      HashCode hashCode;  Path path;
      private final static HashFunction HASH_FUNCTION =
       Hashing.goodFastHash(32);
      FileRecord(File file){
       this.hashCode = hashFile(file);   this.path = file.toPath();  }

      private HashCode hashFile (File file){

      try {
       HashCode hash = Files.asByteSource(file).hash(HASH_FUNCTION);   System.out.println("FILE " +file + " HASHED USING " + HASH_FUNCTION );   return hash;
      }catch (IOException e){
       throw new RuntimeException(e);  } 
     }

    }
    }

Misal saya ingin memeriksa serta menghapus file yang duplicate dalam folder : /User/tamy/Documents/Belajar/Folder/
Dalam method calculateDuplicaties, file-file yang ada dalam folder akan dikumpulkan dalam collection, kemudian file tersebut akan di hash. File yang hasil hash nya sama dan jumlah nya lebih dari satu, itu lah file yang sama dan duplicate. Dan file yang duplicate tersebut akan di tampung dalam satu variable. 
Kemudian file yang duplicate tersebut akan di hapus pada method recursiveDelete .


Sekian dari saya tentang Eliminate file duplicate using guava in spring boot

No comments:

Post a Comment