Java BufferedReader readline вычисляет значения из файла

Я новичок в Java и на данный момент потерял.

У меня есть этот код:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

/**
 *
 * @author Darwish
 */
public class M3UReader {

    /**
     * @param args the command line arguments
     */

    public static boolean isValidHeader(String playList)
    {
        boolean returnValue = false;
        BufferedReader br;
        try
        {
            br = new BufferedReader(new FileReader(new File(playList)));
            String s = br.readLine(); // declares the variable "s"
            if(s.startsWith("#EXTM3U")) { // checks the line for this keyword
                returnValue = true; // if its found, return true
            }
            br.close();
        }
        catch (Exception e)
        {
            System.err.println("isValidHeader:: error with file "+ playList + ": " + e.getMessage());
        }

        return returnValue;
    }
    public static int getNumberOfTracks(String playList)
    {
        int numberOfTracks = 0; // sets the default value to zero "0"
        try
        {
            BufferedReader br = new BufferedReader(new FileReader(new File(playList)));
            String s;
            while((s = br.readLine())!=null) // if "s" first line is not null
            {
                if(s.startsWith("#")==false) { // if the first line starts with "#" equals to false. 
                    numberOfTracks++; // increments
                }
            }
            br.close();
        }
        catch (Exception e)
        {
            numberOfTracks = -1; // chek if the file doesnt exist 
            System.err.println("could not open/read line from/close filename "+ playList);
        }
        return numberOfTracks;

    }

    public static int getTotalMinutes(String playList)
    {
        // code needed here
    }

    public static void main(String[] args) {
        // TODO code application logic here
        String filename = "files\\playlist.m3u"; // finds the file to read (filename <- variable declaration.) 
        boolean isHeaderValid = M3UReader.isValidHeader(filename); // declares the variabe isHeaderValid and links it with the class isValidHeader
        System.out.println(filename + "header tested as "+ isHeaderValid); // outputs the results

        if(isHeaderValid)
        {
            int numOfTracks = M3UReader.getNumberOfTracks(filename);
            System.out.println(filename + " has "+ numOfTracks + " tracks ");
        }

    }
}

В методе getTotalMinutes мне нужно найти способ подсчитать итоги значений int, которые были прочитаны из файла. В файле есть такие данные:

#EXTM3U
#EXTINF:537,Banco De Gaia - Drippy F:\SortedMusic\Electronic\Banco De Gaia\Big Men Cry\01 Drippy.mp3
#EXTINF:757,Banco De Gaia - Celestine F:\SortedMusic\Electronic\Banco De Gaia\Big Men Cry\02 Celestine.mp3
#EXTINF:565,Banco De Gaia - Drunk As A Monk F:\SortedMusic\Electronic\Banco De Gaia\Big Men Cry\03 Drunk As A Monk.mp3
#EXTINF:369,Banco De Gaia - Big Men Cry F:\SortedMusic\Electronic\Banco De Gaia\Big Men Cry\04 Big Men Cry.mp3

Число после #EXTINF: это продолжительность музыки, которая, исходя из приведенных выше данных, указана в секундах.

Я не знаю, какой код написать в методе getTotalMinutes, чтобы программа считывала минуты из файла, а затем вычисляла их все, чтобы получить общее количество минут. Я искал в Интернете, как это сделать, к сожалению, я не могу найти. Поэтому любая помощь приветствуется.


person Darwish B    schedule 10.10.2013    source источник
comment
Вопросы по коду должны демонстрировать минимальное понимание решаемой проблемы. Включите предпринятые решения, почему они не сработали и ожидаемые результаты.   -  person Sotirios Delimanolis    schedule 10.10.2013
comment
Что означает продолжительность музыки? Минуты, секунды, тик-так, тим-там?   -  person MadProgrammer    schedule 10.10.2013
comment
продолжительность музыки в секундах.   -  person Darwish B    schedule 10.10.2013


Ответы (3)


Вы можете использовать это, это просто копия вашего метода getNumberTracks, но он анализирует файл так, как вам нужно, чтобы получить общее количество минут:

public static final String beginning = "#EXTINF:";
public static final String afterNumber = ",";

public static int getTotalMinutes(String playList) {
    int value = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader(new File(playList)));
        String s;
        while ((s = br.readLine()) != null) // if "s" first line is not null
        {
            if (s.contains(beginning)) {
                String numberInString = s.substring(beginning.length(), s.indexOf(afterNumber));
                value += Integer.valueOf(numberInString);
            }
        }
        br.close();
    } catch (Exception e) {
    }
    return value;
}
person libik    schedule 10.10.2013
comment
вау, это решает мою проблему, спасибо! Теперь мне нужно найти способ поместить все в метод getTotalMinutes :) Я думал об использовании s.contains, но я не знаю, что поместить в (). Я пытался использовать %d, к сожалению, это не сработало. - person Darwish B; 10.10.2013

Таким образом, согласно описанию, предоставленному здесь, числовое значение — это количество секунд.

Итак, учитывая String в формате #EXTINF:{d},{t}, вы должны иметь возможность использовать простую манипуляцию String, чтобы получить значение...

String text = "#EXTINF:537,Banco De Gaia - Drippy F:\\SortedMusic\\Electronic\\Banco De Gaia\\Big Men Cry\\01 Drippy.mp3";
String durationText = text.substring(text.indexOf(":") + 1, text.indexOf(","));
int durationSeconds = Integer.parseInt(durationText);
System.out.println(durationSeconds);

Который напечатает 537...

Далее нам просто нужно выполнить простую арифметику времени...

double seconds = durationSeconds;
int hours = (int)(seconds / (60 * 60));
seconds = seconds % (60 * 60);
int minutes = (int)(seconds / 60);
seconds = seconds % (60);

System.out.println(hours + ":" + minutes + ":" + NumberFormat.getNumberInstance().format(seconds));

Что печатает 0:8:57 (или 8 минут и 57 секунд)

person MadProgrammer    schedule 10.10.2013
comment
Спасибо за ваш вклад. Мне удалось преобразовать секунды в минуты с помощью кода пользователя 2854908: int numOfMinutes = M3UReader.getTotalMinutes(filename); System.out.println(имя файла + имеет + количество дорожек + дорожек, + (число минут/60) + всего минут); - person Darwish B; 10.10.2013

Чтобы читать файлы M3U, вам нужно найти информацию о парсерах M3U. Уже доступно много эффективных парсеров с открытым исходным кодом, но вам нужно будет обратить пристальное внимание на их лицензии, если вы планируете продавать или распространять их.

M3u Parser выглядит многообещающе, если вы просто хотите что-то быстрое и эффективное.

Парсер M3u

person Jon    schedule 10.10.2013