من برای گوش دادن موسیقی در اوبونتو از Rhythmbox استفاده می کنم و خیلی ازش راضیم بخصوص از این قابلیتش که تعداد دفعات گوش دادن به یک آهنگ رو نشون میده و بمرور زمان می تونی بفهمی از چه آهنگ هایی بیشتر خوشت میاد و به راحتی هم میزاره بر اساس همین تعداد دفعات گوش دادن Playlist درست کنی. حالا مشکل من از اینجا شروع شد که میخواستم آهنگ های موجود در Playlist مربوط به آهنگ هایی که بیشتر گوش دادم رو بریزم تو USB که بتونم تو ماشین و تلویزیون گوششون کنم ولی Rhythmbox فقط این امکان رو داره که Playlist هارو روی CD یا DVD رایت بزنه! حالا تو این همه فولدر باید چطوری این فایل هارو پیدا می کردم و کپیشون می کردم رو USB. به سرم زد که این کارو با Stream های Java 8 انجام بدم. با یه رفیق پایه دو نفری حدود ۴۵ دقیقه ای کد جاوا نوشتیم که این کارو انجام میده. ابتدا Playlist مورد نظرمو در قالب فایل با پسوند pls ذخیره کردم و بعد با Stream های Java 8 خط به خط پردازشش کردم:

import java.io.*; 
import java.net.URLDecoder; 
import java.nio.channels.FileChannel; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.stream.Stream; 
 
public class Main { 
 
    public static void main(String args[]) { 
 
        String playlistName = "my top.pls"; 
 
        try (Stream<String> stream = Files.lines(Paths.get(playlistName))) { 
 
            stream.filter(line -> line.startsWith("File")) 
                    .map(fileLine -> getFileName(fileLine.split("file://")[1])) 
                    .forEach(fileName -> copyFile(fileName)); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
 
    } 
 
    private static String getFileName(String s) { 
        try { 
            return URLDecoder.decode(s, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
        } 
 
        return ""; 
    } 
 
    private static void copyFile(String fileName) { 
        String[] parts = fileName.split("/"); 
 
        File fileToCopy = new File(fileName); 
        File newFile = new File("/home/saeed/Desktop/rhythmbox-playlist/saeed-playlist/" + parts[parts.length - 1]); 
 
        try { 
            try (FileInputStream inputStream = new FileInputStream(fileToCopy); 
                 FileOutputStream outputStream = new FileOutputStream(newFile) 
            ) { 
                FileChannel inChannel = inputStream.getChannel(); 
                FileChannel outChannel = outputStream.getChannel(); 
                inChannel.transferTo(0, fileToCopy.length(), outChannel); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
 
    } 
 
 
}