IO 처리

  • BufferedReader > 버퍼 포함한 FileReader > 버퍼 없이 FileRader 속도 순으로 빠르다.
  • DirectByteBuffer를 사용할 때 주의해야한다. ByteBuffer 객체를 생성하는 메서드 중 allocateDirect()가 있는데 OS 메모리에 할당된 메모리를 Native한 JNI로 처리하는 DirectByteBuffer 객체를 생성한다. DirectByteBuffer 생성자는 java.nio에 아무런 접근 제어자가 없이 선언된 Bits라는 클래스의 reverseMemory() 메서드를 호출하고 이 메서드는 JVM에 할당되어 있는 메모리보다 더 많은 메모리를 요구할 경우 System.gc() 메서드를 호출하도록 되어있다. singleton 패턴을 사용하여 해당 JVM에는 하나의 객체만 생성하도록 권장한다.
  • lastModified() 대신 WatchService를 사용하는 실습
public class WatchSample {
	public static void main(String[] args) {
		WatcherThread thread = new WatcherThread("C:\\Temp");
		thread.start();
	}
}
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.Date;
import java.util.List;

import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

public class WatcherThread extends Thread{
	String dirName;
	public WatcherThread(String dirName) {
		this.dirName=dirName;
	}
	public void run() {
		System.out.print("Watcher is started");
		fileWatcher();
		System.out.println("Watcher is ended");
	}
	public void fileWatcher() {
		try {
			Path dir = Paths.get(dirName);
			WatchService watcher = FileSystems.getDefault().newWatchService();
			dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
			
			WatchKey key;
			for(int loop=0; loop<4; loop++) {
				key = watcher.take();
				String watchedTime = new Date().toString();
				List<WatchEvent<?>> eventList = key.pollEvents();
				for(WatchEvent<?> event : eventList) {
					Path name = (Path) event.context();
					if(event.kind() == ENTRY_CREATE) {
						System.out.format("%s created at %s%n", name, watchedTime);
					} else if(event.kind() == ENTRY_DELETE) {
						System.out.format("%s deleted at %s%n", name, watchedTime);
					} else if(event.kind() == ENTRY_MODIFY) {
						System.out.format("%s modified at %s%n", name, watchedTime);
					}
				}
				key.reset();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


출처 : 자바 성능 튜닝 이야기 이상민 지음