0

我是 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 方法上写什么代码来让程序从文件中读取分钟数,然后计算所有这些分钟数以获得总分钟数。我在网上搜索了如何做到这一点,不幸的是我找不到任何东西。所以任何帮助表示赞赏。

4

4 回答 4

0

You can use this, its just copy of your getNumberTracks method but it is parsing the file the way you need to get total minutes :

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;
}
于 2013-10-10T03:20:59.523 回答
0

So, based on the description provided from here, the numeric value is the number of seconds.

So, given a String in the format of #EXTINF:{d},{t} you should be able to use simple String manipulation to get the value out...

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);

Which will print 537...

Next we just need to do some simple time arithmetic...

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));

Which prints 0:8:57 (or 8 minutes and 57 seconds)

于 2013-10-10T03:21:48.283 回答
0

要阅读 M3U 文件,您需要搜索有关 M3U 解析器的信息。已经有许多高效的开源解析器可用,但如果您打算出售或分发它,则需要密切关注它们的许可证。

如果您只想要快速高效的东西,M3u Parser 看起来很有前途。

M3u 解析器

于 2013-10-10T03:31:22.003 回答
0
    public static int getTotalMinutes(String filename) {
    int totalSeconds = 0;

    if (isValidHeader(filename)) {
        try (BufferedReader br = new BufferedReader(new FileReader(new File(filename)));) {
            String nextLine;
            while ((nextLine = br.readLine()) != null) {
                //If the next line is metadata it should be possible to extract the length of the song
                if (nextLine.startsWith(M3U_METADATA)) {
                    int i1 = nextLine.indexOf(":");
                    int i2 = nextLine.indexOf(",");
                    String substr = nextLine.substring(i1 + 1, i2);
                    totalSeconds += Integer.parseInt(substr);
                }
            }
        } catch (IOException | NumberFormatException e) {
            //Exception caught - set totalSeconds to 0
            System.err.println("getTotalSeconds:: error with file " + filename + ": " + e.getMessage());
            totalSeconds = 0;
        }
    }

    return totalSeconds;
}
于 2014-10-13T18:25:23.990 回答