Java 7 에 java.nio.file 패키지가 들어왔다.
java.io.File은 OS 에서 제공하는 다양한 파일시스템 특성들을 대부분 무시했기 때문에 쉘스크립트에서 $ cp src /path/to/dest 면 끝날 것을 꽤나 긴 코드를 쓰거나 commons-io FileUtils.copyFile 따위를 써야했었는데 이제는 java.nio.file.Files.[copy](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#copy(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption...))(Path src, Path dest, CopyOption option)으로 작업을 마칠 수 있다. java.nio.file.Files.[move](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#move(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption...))의 CopyOption은 자바답지 않게 무려 ATOMIC_MOVE를 지원하는데 이는 Windows OS인 경우 MoveFileEx 콜이고, Linux/Solaris의 경우 rename(2) 콜이라, 동일 파티션 내의 큰 파일을 옮기더라도 광속이다.
Python의 open('.vimrc').readlines() 과 동일한 작업을 하는 Files.[readAllLines](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllLines(java.nio.file.Path, java.nio.charset.Charset))(Path, Charset) 도 반겨줄만하다.
이전에는 특정 디렉토리 밑의 모든 파일들에 대한 처리를 하기 위해 재귀호출을 하는 수고를 피할 수 없었는데 Files.[walkFileTree](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path, java.nio.file.FileVisitor))(Path, FileVisitor<T>)를 통해 아래와 같이 간단히 처리할 수 있다.
import java.nio.file.*;
import java.nio.file.attribute.*;
...
FileSystem fs = FileSystems.getDefault();
Files.walkFileTree(fs.getPath("./rust-0.1/"), new SimpleFileVisitor() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
});
마지막으로 언급하지 않을 수 없는 WatchService ! 파일시스템 이벤트들을 받을 수 있다. 예를들어 특정 디렉토리 속에 임의의 파일이 생기고 지워지는 등의 각종 이벤트들 말이다. 리눅스의 경우 inotify_add_watch(2) 와 poll(2) 콜이고, 솔라리스는 <port.h> 속의 각종 port_create, port_associate, port_send 등이며, 윈도우즈는 kernel32.dll의 ReadDirectoryChanges 콜이다. WatchService를 잘 활용한다면 개발환경 품질 향상을 꾀할 수 있다. 상상은 각자 알아서.
NIO.2 소개는 여기까지다.
Comments
2 thoughts shared
jude
ㅎㅎ 잘봤습니다.
Continue Reading
Discover more thoughts and insights
미투데이 덕에 tinyurl 스러운 것 만들다
미투데이에 글을 남길 때는 북마클릿을 사용하더라도 URL 포함 150자를 넘지 못한다. 그래서 tinyurl를 쓰곤 한다던데, 자식 tinyurl.com 이면 xrath.com 보다도 긴 주제에
팀 이동 전 동료들과의 대화
팀 이동이 결정된 지 1주일이 지났지만 팀장이 공식 어나운스를 미루고 있어서.. 동료평가 때 내가 S급으로 잘 준 사람들 위주로 따로 만나 대화를 나누다 오후가 다 갔다. 같이 손발 맞추며 미래를 그리다가 배신당한
빠르게 끝낼 수 없다면 할 수 없는 일
not dead yet. 1년에 한 번 정도는 슬럼프에 빠진다. 허영이 섞인 말이다. 1년에 족히 서너번은 슬럼프에 빠진다. 이번 슬럼프는 3주밖에 날 벌하지 못했지만 통상 1-2달을 잡아먹는다. 2달씩