как прибавить время из файла в минуты и секунды?

у меня есть вот такой код : `

public static void main(String[] args) throws UnsupportedEncodingException, IOException {
    String Zombie = "Королевский зомби";
    String Slime = "Сточный слизень";
    String Spider = "Матка";
    String Cow = "Коровка из Коровёнки";
    String Yeti = "Йети";
    String Levik = "Левиафан";
    String Fish = "Хранитель подводного мира";
    String Ghast = "Небесный владыка";

    String ZOMBIE_BOSS = Zombie;
    String SLIME_BOSS = Slime;
    String SPIDER_BOSS = Spider;
    String COW_BOSS = Cow;
    String YETI_BOSS = Yeti;
    String LEVIK_BOSS = Levik;
    String FISH_BOSS = Fish;
    String GHAST_BOSS = Ghast;
    {
        String[] Bosses = new String[] {ZOMBIE_BOSS, SLIME_BOSS, SPIDER_BOSS, COW_BOSS, YETI_BOSS, LEVIK_BOSS, FISH_BOSS, GHAST_BOSS};
        
        String lineFromFile;    
        String s = File.separator;
        String path = s+ "Users" +s+ "Арслан" +s+ "eclipse-workspace" +s+ "BossCheck" +s+ "src" +s+ "Boss" +s+ "Logs.txt";
       
                    
        
        try (InputStreamReader inputStreamReader = new InputStreamReader
                (new FileInputStream(path), "Windows-1251")) {
            try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                while (bufferedReader.ready()) {
                    lineFromFile = bufferedReader.readLine();
                    int bossIndex = -1;
                    for (int i = 0; i < Bosses.length; i++) {
                        if (lineFromFile.contains(Bosses[i])) {
                            bossIndex = i;
                            break;
                        }
                    }
                    if (bossIndex != -1) {
                        String[] str2 = lineFromFile.split(Bosses[bossIndex] + " " + "был повержен за ");
                        if (str2.length > 1) {
                            str2 = str2[1].split(" ");
                            int time = Integer.parseInt(str2[0]);
                            
                            String timeStamp = new SimpleDateFormat("HH" + ":" + "mm" +  ":" + "ss").format(Calendar.getInstance().getTime());
                            
                            System.out.println(timeStamp);
                            
                        }
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();{
                }
            }
        }
    }
}

} `

я хотел сделать так, чтобы он переводил 1 минуту и 50 секунд из текстового файла

https://imgur.com/a/EtuAEly

их в 53 строку кода, то-есть часы в "HH", минуты в "mm", а секунды в "ss"


Ответы (1 шт):

Автор решения: Дмитрий

Для начала давайте избавимся от нечитаемого ужаса. Для этого вспоминаем SOLID, хотя хватит и 1 принципа. Теперь разбиваем все на максимально короткие и простые методы с минимальным функционалом. Избавляемся от устаревших способов чтения файла, а также от бессмысленных переменных и прочего, получаем примерно следующее :

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.stream.Stream;

    public class Main {
        
        private final static String DURATION_PATTERN = "%d:%02d:%02d";
    
        public static void main(String[] args) throws Exception {
            
            String[] bosses = Stream.of("Королевский зомби", "Сточный слизень", "Матка", "Коровка из Коровёнки", 
                    "Йети", "Левиафан", "Хранитель подводного мира", "Небесный владыка").toArray(String[]::new);
    
            //String lineFromFile;
            String s = File.separator;
            String path = s + "Users" + s + "Арслан" + s + "eclipse-workspace" + s + "BossCheck" + s + "src" + s + "Boss" + s + "Logs.txt";
            Duration[] durations = read(path, bosses);
            for (Duration duration : durations) System.out.println(durationToString(duration));
            
        }
        
        private static Duration[] read(String path, String[] bosses) throws IOException {
            try (Stream<String> stream = Files.lines(Paths.get(path), Charset.forName("Windows-1251"))) {
                return stream.filter(line -> Stream.of(bosses).anyMatch(e -> line.contains(e)))
                        .map(line -> parseToDuration(line))
                        .toArray(Duration[]::new);
            }
        }
        
        public static Duration parseToDuration(String line) {
            //TODO -> parse line, get h,m,s and put it to duration instead of 1,70,20 (stubs)
            return Duration.ofHours(1).plusMinutes(70).plusSeconds(20);
        }
        
        private static String durationToString(Duration duration) {
            return String.format(DURATION_PATTERN, duration.getSeconds() / 3600, 
                    (duration.getSeconds() % 3600) / 60, (duration.getSeconds() % 60));
        }
        
    }

А вот теперь в методе parseToDuration вам нужно разобрать строку, которая вам приходит в аргументах. Причем лишних строк в этот метод уже не приходит (они фильтруются ранее). Получаем часы, минуты, секунды и подставляем их вместо заглушек в стандартный класс, хранящий временные промежутки - Duration.

→ Ссылка