apache的digester已经升到3.2的版本,3以后的版本比较爽,可以直接使用annotation来定义rule。
1.酷狗播放列表长的什么样呢?
他导出的是以 .kgl后缀的文件,其实就是xml格式的,哈哈,如下:
<?xml version="1.0" encoding="UTF-8"?> <List ListName="赵传"> <File> <MediaFileType>0</MediaFileType> <FileName>赵传 - 爱要怎么说出口.mp3</FileName> <FilePath>H:\01-娱乐\01-音乐\KuGou\</FilePath> <FileSize>6748736</FileSize> <Duration>281208</Duration> <Hash>359db1787952c1d65803c3936796402c</Hash> <Lyric></Lyric> <Bitrate>191992</Bitrate> </File> <File> <MediaFileType>0</MediaFileType> <FileName>赵传 - 我终于失去了你.mp3</FileName> <FilePath>H:\01-娱乐\01-音乐\KuGou\</FilePath> <FileSize>6833544</FileSize> <Duration>285152</Duration> <Hash>cb4c43fe3d214b48be2228040babcaed</Hash> <Lyric></Lyric> <Bitrate>191716</Bitrate> </File> </list>
2.怎么定义播放列表呢?
2.1 定义播放列表实体
@ObjectCreate(pattern = "List") public class MusicPlayList implements Serializable { private static final long serialVersionUID = -5345631686784548242L; @SetProperty(pattern = "List", attributeName = "ListName") private String name; private List<MusicFile> fileList = new ArrayList<MusicFile>(); @SetNext public void addFile(MusicFile file) { fileList.add(file); } // Getter and Setter }
2.2 定义关联音乐文件实体
public class MusicFile implements Serializable { private static final long serialVersionUID = 1428265224588267115L; @BeanPropertySetter(pattern="List/File/MediaFileType") private String mediaFileType; @BeanPropertySetter(pattern="List/File/FileName") private String fileName; @BeanPropertySetter(pattern="List/File/FilePath") private String filePath; @BeanPropertySetter(pattern="List/File/FileSize") private long fileSize; @BeanPropertySetter(pattern="List/File/Duration") private String duration; @BeanPropertySetter(pattern="List/File/Hash") private String hash; @BeanPropertySetter(pattern="List/File/Lyric") private String lyric; @BeanPropertySetter(pattern="List/File/Bitrate") private long bitrate; public File getFile() { return new File(getFilePath(), getFileName()); } // Getter and Setter }
3. 然后如何让定义的annotation生效?
DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromAnnotationsRuleModule() { @Override protected void configureRules() { bindRulesFrom(MusicPlayList.class); } }); Digester digester = digesterLoader.newDigester(); URL dataUrl = Thread.currentThread().getClass().getResource(playListFile); try { return digester.parse(dataUrl); } catch (Exception e) { throw new RuntimeException("Play list parse failuer.", e); }
4. 好了,应该可以拷贝文件了吧
是的,可以看看我们的工具类了
public class ExportTool { public static void exportFileFromPlayList(String playListFile, String toDir) { MusicPlayList playList = digesterPlayList(playListFile); File tofolder = new File(toDir, playList.getName()); if (!tofolder.exists()) { tofolder.mkdirs(); } Iterator<MusicFile> musicFilesInterator = playList.list(); while (musicFilesInterator.hasNext()) { MusicFile file = musicFilesInterator.next(); if (!file.getFile().exists()) { continue; } copy(file.getFile(), tofolder); } } private static MusicPlayList digesterPlayList(String playListFile) { DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromAnnotationsRuleModule() { @Override protected void configureRules() { bindRulesFrom(MusicPlayList.class); } }); Digester digester = digesterLoader.newDigester(); URL dataUrl = Thread.currentThread().getClass().getResource(playListFile); try { return digester.parse(dataUrl); } catch (Exception e) { throw new RuntimeException("Play list parse failuer.", e); } } private static void copy(File from, File toFolder) { try { File toFile = new File(toFolder, from.getName()); if (toFile.exists()) { return; } InputStream input = new FileInputStream(from); OutputStream output = new FileOutputStream(toFile); IOUtils.copy(input, output); } catch (Exception e) { throw new RuntimeException("Copy file from [" + from.getAbsolutePath() + "] to [" + toFolder.getAbsolutePath() + "] failure."); } } }
5. 这个功能还不错,但是我们依赖那些工具呢?
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-digester3</artifactId> <version>3.2</version> </dependency>
6. 具体的代码在附件,可以参考一下哦