Thursday, November 18, 2010

How to Implement Groovy's File.eachLine in Java

One thing that I like from Groovy is that the closures concept. The method File.eachLine() in Groovy is indeed very useful and handy when reading a file line by line. Because of Java's lack of closures, there is a tendency to repeat the steps of reading each line of a file in every code. It is actually quite easy to implement Groovy's File.eachLine in Java.

FileFunction.java
1
2
3
4
public interface FileFunction {
 
    public void read(String line);
}

M3UParserFileFunction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class M3UParserFileFunction implements FileFunction {
 
    private List<File> mp3Files;
    private File m3uFile;
     
    public M3UParserFileFunction(File m3uFile, List<File> mp3Files) {
        this.mp3Files = mp3Files;
        this.m3uFile = m3uFile;
    }
     
    @Override
    public void read(String line) {
        if (!line.trim().startsWith("#")) {
            if (line.trim().toLowerCase().endsWith(".mp3")) {
                // Try relative path first, then absolute path.
                File file = new File(m3uFile.getParentFile(), line.trim());
                if (file.exists()) {
                    mp3Files.add(file);
                } else if (!file.exists()) { // Use absolute path
                    file = new File(line.trim());
                    if (file.exists()) {
                        mp3Files.add(file);
                    }
                }
            }
        }
    }
}

FileUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class FileUtils {
 
    private FileUtils() {
    }
 
    public static void eachLine(File file, FileFunction fileFunction) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(file));
            String line = "";
            while ((line = br.readLine()) != null) {
                fileFunction.read(line);
            }
        } finally {
            if (br != null) {
                br.close();
            }
        }
    }
}

1
2
3
List<File> files = new ArrayList<File>();
FileUtils.eachLine(m3uFile, new M3UParserFileFunction(m3uFile, files));
for (File file : files) { doWhatever(file); }

No comments:

Post a Comment