2015-11-23

NashornでFileVisitorを使って再帰的に同じ拡張子のファイルを収集する

1. ファイルを収集する対象のディレクトリ構造

./
  article-result.html
  article.html
  FileVisitorTest.js
  dir1/
    test1.txt
  dir2/
    test2.js

2. 実行するスクリプト(FileVisitorTest.js):

var Files = Java.type("java.nio.file.Files");
var Paths = Java.type("java.nio.file.Paths");
var FileVisitResult = Java.type("java.nio.file.FileVisitResult");
var SimpleFileVisitor = Java.type("java.nio.file.SimpleFileVisitor");
var ArrayList = Java.type("java.util.ArrayList");

function getPathListByPredicate(rootDir, predicateFunc) {
    var SimpleFileVisitorExtender = Java.extend(SimpleFileVisitor);
    var pathList = new ArrayList();
    var visitor = new SimpleFileVisitorExtender() {
        visitFile: function(path, attrs) {
            if (predicateFunc(path, attrs)) {
                pathList.add(path);
            }
            return FileVisitResult.CONTINUE;
        }
    };
    Files.walkFileTree(Paths.get(rootDir), visitor);
    return pathList;
}

var rootDir = Paths.get(".");

// List all files
var allFiles = getPathListByPredicate(rootDir, function(path, attrs) {
    return true;
});
print("allFiles=${allFiles}");

// List .js files
var jsFiles = getPathListByPredicate(rootDir, function(path, attrs) {
    return path.getFileName().toString().toLowerCase().endsWith(".js");
});
print("jsFiles=${jsFiles}");

3. jjsで実行する:

>jjs -scripting -fullversion FileVisitorTest.js
nashorn full version 1.8.0_66-b18
allFiles=[.\article-result.html, .\article.html, .\dir1\test1.txt, .\dir2\test2.js, .\FileVisitorTest.js]
jsFiles=[.\dir2\test2.js, .\FileVisitorTest.js]

0 件のコメント:

コメントを投稿