2015-11-23 3 views
3

Я хочу создать обновление, но я не уверен, как я хочу сделать эту часть. Я хочу, чтобы мой обновитель проверял наличие обновлений, а затем подсчитывал все обновления, которые он должен выполнить, так что: вам все равно нужны 3/5 обновления. или что-то типа того. Я знаю, что он проверяет наличие обновления и, если есть обновление, он загружает это обновление напрямую, после чего он проверяет наличие другого обновления и загружает его, но я хочу, чтобы он проверял все обновления и после этого загружал их. Это класс LauncherСоздание обновления. Обновление/загрузка части

package com; 

import com.check.Checker; 
import com.download.DownloadData.DownloadFiles; 

public class Launcher { 

    public static void main(final String[] args) { 
     for (DownloadFiles df: DownloadFiles.values()) { 

      String fileName = df.fileName; 
      String URL = df.URL; 

      switch(Checker.isLatest(fileName, URL)) { 
      case 0: 
       System.out.println("Downloading " + fileName + "."); 
       break; 
      case 1: 
       System.out.println("Updating " + fileName + "."); 
       break; 
      case 2: 
       System.out.println(fileName + " is up to date."); 
       break; 
      } 
     } 
    } 

} 

и это метод isLatest:

public static byte isLatest(String fileName, String downloadUrl) { 
     if (!hasFile(fileName)) { 
      System.out.println("[" + fileName + "]" + "There is no file yet."); 
      return 0; 
     } 
     try { 
      if (DigestUtils.md5Hex(new FileInputStream(Settings.saveDir)).equalsIgnoreCase(DigestUtils.md5Hex(new URL(downloadUrl).openStream()))) { 
        System.out.println("[" + fileName + "]" + "Your file is up to date."); 
       return 2; 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("[" + fileName + "]" + "Your file needs to be updated."); 
     return 1; 
    } 

Так что мой вопрос: Как сделать пусковую сделать это в следующем порядке: проверять обновления. Перечислите обновления и после этого загрузите обновления.

+0

Я думаю, что вы нажали "возврат" в начале. – xX4m4zingXx

ответ

5

Я не совсем уверен, что я понял ваш вопрос, но, может быть, вы хотите сделать STH как:

//in Launcher 

EnumSet<DownloadFileS> filesToUpdate = checkForUpdates(DownloadFiles.values()); 

listFilesToUpdate(filesToUpdate); 

downloadFiles(filesToUpdate); 

Тогда в checkForUpdates вы просто создать список файлов, которые изменились с момента последней синхронизации, в listFilesToUpdate вы просто распечатываете их и в downloadFiles(filesToUpdate) вы их загружаете. В основном у вас уже есть все в вашем методе isLatest - вам просто нужно разделить его на ответственность.

UPDATE

public List<DownloadFiles> checkForUpdates(List<DownloadFiles> allFiles) { 
    allFiles.stream() 
     .filter(file -> !hasFile(file.getFilename()) || !fileUpToDate(file)) 
     .collect(toList()) 

private boolean isFileUpToDate(DownloadFiles file) { 
    return DigestUtils.md5Hex(new FileInputStream(Settings.saveDir)) 
     .equalsIgnoreCase(DigestUtils.md5Hex(new URL(downloadUrl).openStream()))); 

СЛЕДУЮЩИЙ UPDATE

public static void main(String[] args) { 
    List<DownloadFiles> filesToUpdate = checkForUpdates(DownloadFiles.values()); 

    listFilesToUpdate(filesToUpdate); 

    downloadFiles(filesToUpdate); 
} 

private static void downloadFiles(List<DownloadFiles> filesToUpdate) { 
    filesToUpdate.stream() 
     .forEach(file -> downloadFile(file)); 
} 

private static void downloadFile(DownloadFiles file) { 
    try { 
    URL website = new URL(file.URL); 
    ReadableByteChannel rbc = Channels.newChannel(website.openStream()); 
    FileOutputStream fos = new FileOutputStream(file.filename); 
    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
    } catch (IOException e) { 
    throw new RuntimeException(e); 
    } 
} 

private static void listFilesToUpdate(List<DownloadFiles> filesToUpdate) { 
    System.out.println("Following files will be updated"); 
    filesToUpdate.stream() 
     .forEach(System.out::println); 
} 

public static List<DownloadFiles> checkForUpdates(DownloadFiles[] allFiles) { 
    return Arrays.asList(allFiles).stream() 
     .filter(file -> !hasFile(file.filename) || !isFileUpToDate(file)) 
     .collect(Collectors.toList()); 
} 

private static boolean isFileUpToDate(DownloadFiles file) { 
    try (InputStream is = new URL(file.URL).openStream()) { 
    return DigestUtils.md5Hex(new FileInputStream(Settings.saveDir)) 
     .equalsIgnoreCase(DigestUtils.md5Hex(is)); 
    } catch (IOException e) { 
    throw new RuntimeException(e); 
    } 
} 
+0

Умм, я не уверен, что понимаю ваш код.У меня есть код, который проверяет наличие обновлений с помощью md5hex. Этот код просматривает существующие файлы в md5hex, и если он не соответствует, то он должен добавить их в список загрузки или что-то в этом роде. – xX4m4zingXx

+0

теперь понятно? Я думаю, что я не совсем понимаю ваш вопрос. Не могли бы вы попросить его кратко? – k0ner

+0

Можете ли вы объяснить, что делает этот код? Поэтому я знаю, как его реализовать. – xX4m4zingXx

1

Я не уверен с точки зрения кода, но вы хотели бы, чтобы клиент подключился к серверу и проверил какой-то метод, в какой версии обновлений он включен. например Клиент находится на 1.0.3, а сервер - на 1.0.5, поэтому x необходимо обновить. Затем вам нужно будет загрузить/обновить файлы и установить их или что-то еще.

Наконец, вам нужно будет обновить список версий в клиенте и сохранить его где-нибудь (текстовый файл?), Чтобы процесс мог начать с текущей точки в следующий раз.

[Не могу комментировать. Извините]

+0

Хорошо, мои обновления загружаются из Dropbox. Есть ли другой способ хранения временной информации? Как в массиве, который содержит имя файла, загрузите URL-адрес, и если его нужно удалить, а затем загрузить или загрузить. – xX4m4zingXx

+0

Возможно, вы сохранили его в массиве. Но помните, что данные должны быть в коде или быть перезаписаны при каждом перезапуске. Лично я хотел бы хранить информацию в текстовом файле, который записывает списки версий. Затем просто проанализируйте текстовый файл, сравнивающий различия. – AKTheKnight

+0

. Я проверяю различия в md5hex, который отличается в каждой версии файла, правильно? – xX4m4zingXx

Смежные вопросы