1. 程式人生 > >java對lrc型別檔案進行解析

java對lrc型別檔案進行解析

package com.routon.utils;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.util.Log;

/**
 * parse lrc file tool
 * eg:
 * utilLrc lrc = new utilLrc("/sdcard/test.lrc");
 * get song name : String title = lrc.getTitle();
 * get performer name : String artist = lrc.getArtist();
 * get album name: String album = lrc.getAlbum();
 * get lrcmaker name: String lrcMaker = lrc.getLrcMaker();
 * get song list: List<Statement> list = lrc.getLrcList();
 * 
 * @author xuweilin
 *
 */
public class utilLrc {
	private static String TAG = "utilLrc";
	public class Statement {
		private double time  = 0.0;		//time, 0.01s
		private String lyric = "";		//song word
		/*
		 * get time
		 */
		public double getTime() {
			return time;
		}
		/*
		 * set time
		 */
		public void setTime(double time) {
			this.time = time;
		}
		/*
		 * set time.format:mm:ss.ms
		 */
		public void setTime(String time) {
			String str[] = time.split(":|\\.");
			this.time = Integer.parseInt(str[0])*60+Integer.parseInt(str[1])+Integer.parseInt(str[2])*0.01;
		}
		/*
		 * get lrc word
		 */
		public String getLyric() {
			return lyric;
		}
		/*
		 * set lrc word
		 */
		public void setLyric(String lyric) {
			this.lyric = lyric;
		}
	}
	private BufferedReader bufferReader = null;					
	private String title = "";										
	private String artist = "";									
	private String album = "";									
	private String lrcMaker = "";								
	private List<Statement> statements = new ArrayList<Statement>();		
	
	/* 
	 *  
	 * fileName
	 */
	public utilLrc(String fileName) throws IOException{
		FileInputStream file = new FileInputStream(fileName);
		bufferReader = new BufferedReader(new InputStreamReader(file, "utf-8"));
		readData();
	}
	
	/*
	 * read the file 
	 */
	private void readData() throws IOException{
		statements.clear();
		String strLine;
		while(null != (strLine = bufferReader.readLine()))
		{
			if("".equals(strLine.trim()))
			{
				continue;
			}
			if(null == title || "".equals(title.trim()))
			{
				Pattern pattern = Pattern.compile("\\[ti:(.+?)\\]");
				Matcher matcher = pattern.matcher(strLine);
				if(matcher.find())
				{
					title=matcher.group(1);
					continue;
				}
			}
			if(null == artist || "".equals(artist.trim()))
			{
				Pattern pattern = Pattern.compile("\\[ar:(.+?)\\]");
				Matcher matcher = pattern.matcher(strLine);
				if(matcher.find())
				{
					artist=matcher.group(1);
					continue;
				}
			}
			if(null == album || "".equals(album.trim()))
			{
				Pattern pattern = Pattern.compile("\\[al:(.+?)\\]");
				Matcher matcher = pattern.matcher(strLine);
				if(matcher.find())
				{
					album=matcher.group(1);
					continue;
				}
			}
			if(null == lrcMaker || "".equals(lrcMaker.trim()))
			{
				Pattern pattern = Pattern.compile("\\[by:(.+?)\\]");
				Matcher matcher = pattern.matcher(strLine);
				if(matcher.find())
				{
					lrcMaker=matcher.group(1);
					continue;
				}
			}
			int timeNum=0;										
			String str[] = strLine.split("\\]");				
			for(int i=0; i<str.length; ++i)
			{
				String str2[] = str[i].split("\\[");			
				str[i] = str2[str2.length-1];
				if(isTime(str[i])){
					++timeNum;
				}
			}
			for(int i=0; i<timeNum;++i)					
			{
				Statement sm = new Statement();
				sm.setTime(str[i]);
				if(timeNum<str.length)					
				{
					sm.setLyric(str[str.length-1]);
				}
				statements.add(sm);
			}
		}
		sortLyric();
	}
	/*
	 * judge the string is or not date format. 
	 */
	private boolean isTime(String string)
	{
		String str[] = string.split(":|\\.");
		if(3!=str.length)
		{
			return false;
		}
		try{
			for(int i=0;i<str.length;++i)
			{
				Integer.parseInt(str[i]);
			}
		}
		catch(NumberFormatException e)
		{
			Log.e(TAG, "isTime exception:"+e.getMessage());
			return false;
		}
		return true;
	}
	/*
	 * sort the word by time. 
	 */
	private void sortLyric()
	{
		for(int i=0;i<statements.size()-1;++i)
		{
			int index=i;
			double delta=Double.MAX_VALUE;
			boolean moveFlag = false;
			for(int j=i+1;j<statements.size();++j)
			{
				double sub;
				if(0>=(sub=statements.get(i).getTime()-statements.get(j).getTime()))
				{
					continue;
				}
				moveFlag=true;
				if(sub<delta)
				{
					delta=sub;
					index=j+1;
				}
			}
			if(moveFlag)
			{
				statements.add(index, statements.get(i));
				statements.remove(i);
				--i;
			}
		}
	}
	/**
	 * get title
	 * @return
	 */
	public String getTitle(){
		return title;
	}
	/**
	 * get artist
	 * @return
	 */
	public String getArtist(){
		return artist;
	}
	/**
	 * get album
	 * @return
	 */
	public String getAlbum(){
		return album;
	}
	/**
	 * get lrc maker
	 * @return
	 */
	public String getLrcMaker(){
		return lrcMaker;
	}
	/**
	 * get song list
	 * @return
	 */
	public List<Statement> getLrcList(){
		return statements;
	}
}

相關推薦

javalrc型別檔案進行解析

package com.routon.utils; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.Inpu

python某一路徑下的某種型別檔案進行批量重新命名

"""對某一路徑下的某種型別檔案進行批量重新命名""" import os #檔案路徑,注意用/或\\,不能用\ path='D:\\CrawledData' #返回指定的資料夾包含的檔案或資料夾的名字的列表 file_list=os.listdir(path) n=0 for file_obj i

Python指令碼--基於正則表示式檔案進行解析

Python指令碼--基於正則表示式對檔案進行解析     首先需要了解正則表示式中的相應指令(compile、findall),我對此的理解是compile相當於一個規則的制定者,將匹配的規則制定出來,後續具體的操作是findall的工作【選擇適當的規則

【XML解析】(1)Java下使用JAXP中的DOM解析方式XML文件進行解析

關於JAXP、DOM、SAX: 何為JAXP? JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API。 JAXP中分為三種解析方式: DOM解析、SAX解析、StAX

使用tar和gzip某資料夾內的某型別檔案進行壓縮與解壓縮

有時候,需要對某個資料夾內的某個型別的檔案進行壓縮。由於使用tar壓縮時會把絕對路徑也壓縮排去,這時解壓縮則會多出這些資料夾結構,很麻煩,那麼使用如下命令: tar -C /dir1/dir2 -czvf /dir3/dir4/my.tar.gz *.ext1 解釋如下

Java——時間型別進行運算(前移、後移、加減操作)

摘要:記錄一下,如何在java 程式中對獲取到的時間進行前移操作,或者是後移操作。比如:獲取時間是2018/07/02/ 17:30:00,怎麼將該時間往前(後)推移8個小時<可跨天>目錄簡介1.程式碼塊一、話不多說,直接上程式碼public Date dealT

JavaCSV文件進行讀寫操作

分隔 sta 讀取csv文件 pan [] out pub set all 需要jar包:javacsv-2.0.jar 讀操作 // 讀取csv文件的內容 public static ArrayList<String> readCsv(String

使用pull方式和sax方式xml文件進行解析

tostring 需要 nts tag .com version thp response pri 這是我自己設置的xml文件 用一下方式獲取它的內容 try{ OkHttpClient client = new OkHttpClient(); Request

如何輸出html原始碼,html程式碼不進行解析

我們知道,瀏覽器會自動解析html程式碼,直接輸出解析後的效果。但有時我們希望輸出程式碼結構,並不想被解析,有辦法做到嗎?答案是肯定的,下面介紹下直接輸出原始碼的方法。 方法一:<xmp>標籤 把不需要被解析的html程式碼放入標籤<xmp><\xmp>

git已有檔案進行忽略提交

1、場景描述 本地開發Django專案argus,/argus/settings.py檔案因有資料庫地址不想根據版本每次進行提交。 2、具體操作 2.1、到git根目錄,找到.gitignore檔案並開啟,新增內容: /argus/settings.py 2.2、提交.

Android 4.4 網路get請求出現中文亂碼 導致伺服器無法傳輸的資料進行解析

最近在進行Android開發的過程中,發現了一個問題,特意在這裡記錄一下。下面我來描述一下這個問題:當我在Android 4.4版本進行http get請求的時候,我的get請求連結裡的中文字串顯示為???,導致伺服器不能正常識別我的引數,從而使程式執行出錯(並不是所有的An

java提交的字串進行非法字元的過濾

public String CheckReplace(String s) { try { if ((s == null) || (s.equals(""))) return "";

perl指令碼遍歷資料夾及SAC波形檔案進行去儀器響應、濾波等操作實現

1.  如題,perl指令碼遍歷子資料夾及對子資料夾下檔案處理: #!/usr/bin/env perl #遍歷資料夾$rawpath下的所有子目錄,並對子目錄下的檔案進行操作; my $rawpath="/home/liuyi/evt_test"; opendir (

java日期Date類進行加減運算、年份加減,月份加減

日期比較:簡單的比較可以以字串的形式直接比較,也可使用java.sql.Date.valueOf("2007-03-08").compareTo(java.sql.Date.valueOf("2007-03-18")) 方式來比較日期的大小.也可使用java.util.Date.after(java.util

javaMongoDB3.4.2進行增刪改條件查詢操作

一段完整的MongoDB基本操作Demo,實現了連線資料庫,進行增刪改查操作,其中條件查詢實現了與sql中and和or查詢 public class MongoDBJDBC { public static void main(String[] args){

javaList型列表進行排序(通過內部類compare(**)方法重寫)

Collections.sort(upgradeUsefulList, new Comparator<List<Object>>(){     public int compare(List&l

Java Double 型別四捨五入

下面簡單給出三種:個人喜歡第一種,比較靈活,保留多少位很方便設定 import java.math.RoundingMode; import java.text.NumberFormat; publ

java 兩個list進行“交集,並集,差集,去重複並集”的操作

@Test public void testTwoList(){ List<String> a = new ArrayList<String>(); List<

使用Cmder在Windows下按照時間大日誌檔案進行切分

首先下載安裝Cmder,下載地址:http://cmder.net/ 下載完整版,解壓到沒有中文的路徑下。在Path中新增cmder的位置,要到bin目錄。 這一步做完已經可以使用Cmder了,但是為了方便,需要註冊右鍵選單。 使用管理員身份開啟cmd視窗,執行下面這一條命令 cmd

類似於c語言讀取檔案進行解析

        $log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/'.date('Ym').'/'.date('d').'_error.log';            //$log_file_name = '