Java BufferedReader readline计算文件中的值

时间:2013-10-10 03:05:59

标签: java bufferedreader readline filereader

我是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 个答案:

答案 0 :(得分:0)

你可以使用它,它只是你的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;
}

答案 1 :(得分:0)

因此,根据here提供的说明,数值是秒数。

因此,如果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秒)

答案 2 :(得分:0)

要阅读M3U文件,您需要搜索有关M3U解析器的信息。已有许多高效的开源解析器可供使用,但如果您计划出售或分发此许可证,则需要密切关注其许可证。

如果你只是想要一些快速有效的东西,那么M3u Parser看起来很有希望。

M3u Parser

答案 3 :(得分: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;
}