Created
January 31, 2015 07:07
-
-
Save froop/0c7eee8c6fe27c95ca84 to your computer and use it in GitHub Desktop.
[Java] 指定ディレクトリ下全ファイルのファイル名と内容テキストを一括置換
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class FileRename { | |
private final Path srcDir; | |
private final Path destDir; | |
private final Iterable<RenamePattern> namePatterns; | |
private final Iterable<RenamePattern> contentPatterns; | |
private final Charset charset; | |
public FileRename(Path srcDir, Path destDir, | |
Iterable<RenamePattern> namePatterns, Iterable<RenamePattern> contentPatterns) { | |
this(srcDir, destDir, namePatterns, contentPatterns, Charset.defaultCharset()); | |
} | |
public FileRename(Path srcDir, Path destDir, | |
Iterable<RenamePattern> namePatterns, Iterable<RenamePattern> contentPatterns, | |
Charset charset) { | |
this.srcDir = Objects.requireNonNull(srcDir); | |
this.destDir = Objects.requireNonNull(destDir); | |
this.namePatterns = Objects.requireNonNull(namePatterns); | |
this.contentPatterns = Objects.requireNonNull(contentPatterns); | |
this.charset = Objects.requireNonNull(charset); | |
} | |
public void execute() throws IOException { | |
Files.walkFileTree(srcDir, new RenameFileVisitor(srcDir, destDir)); | |
} | |
private class RenameFileVisitor extends SimpleFileVisitor<Path> { | |
private final Path srcParent; | |
private final Path destParent; | |
public RenameFileVisitor(Path srcParent, Path destParent) { | |
this.srcParent = Objects.requireNonNull(srcParent); | |
this.destParent = Objects.requireNonNull(destParent); | |
} | |
@Override | |
public FileVisitResult preVisitDirectory(Path dir, | |
BasicFileAttributes attrs) throws IOException { | |
if (dir.equals(srcParent)) { | |
Files.createDirectory(destParent); | |
return FileVisitResult.CONTINUE; | |
} else { | |
Path destSub = destParent.resolve(dir.getFileName()); | |
Files.walkFileTree(dir, new RenameFileVisitor(dir, destSub)); | |
return FileVisitResult.SKIP_SUBTREE; | |
} | |
} | |
@Override | |
public FileVisitResult visitFile(Path file, | |
BasicFileAttributes attrs) throws IOException { | |
Path destFile = buildDestFilePath(file); | |
String srcText = new String(Files.readAllBytes(file), charset); | |
writeFile(destFile, srcText); | |
return FileVisitResult.CONTINUE; | |
} | |
private Path buildDestFilePath(Path file) { | |
String srcName = file.getFileName().toString(); | |
String destName = replace(srcName, namePatterns); | |
return destParent.resolve(destName); | |
} | |
private void writeFile(Path file, String text) | |
throws IOException { | |
String destText = replace(text, contentPatterns); | |
Files.write(file, destText.getBytes(charset), | |
StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); | |
} | |
private String replace(String text, Iterable<RenamePattern> patterns) { | |
String res = text; | |
for (RenamePattern item : patterns) { | |
res = item.getPattern().matcher(res).replaceAll(item.getReplacement()); | |
} | |
return res; | |
} | |
} | |
public static class RenamePattern { | |
private final Pattern pattern; | |
private final String replacement; | |
public RenamePattern(String pattern, String replacement) { | |
this(Pattern.compile(pattern), replacement); | |
} | |
public RenamePattern(Pattern pattern, String replacement) { | |
this.pattern = Objects.requireNonNull(pattern); | |
this.replacement = Objects.requireNonNull(replacement); | |
} | |
public Pattern getPattern() { | |
return pattern; | |
} | |
public String getReplacement() { | |
return replacement; | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Sample { | |
public static void main(String[] args) throws IOException { | |
Path srcDir = Paths.get("test/sample1"); | |
Path destDir = Paths.get("test/sample2"); | |
List<RenamePattern> patterns = Arrays.asList( | |
new RenamePattern("sample1", "sample2"), | |
new RenamePattern("Sample1", "Sample2")); | |
new FileRename(srcDir, destDir, patterns, patterns).execute(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment