package fileLock; import java.io.*; import java.nio.channels.*; import java.util.Scanner; public class FileResource { String resource_path; File file; FileInputStream in; FileOutputStream out; /** * @param args * @throws IOException * * use File as a resource with lock * file contains ascii represented number which means number of resources * * file must exists before execution and it must contain text represented * number of resources. * * % echo 5 > hoge_resource * */ FileResource(String path) { resource_path = path; } public void open_with_lock() throws IOException { file = new File(resource_path); if (! file.exists()) { System.out.print(resource_path); System.out.println(" does not exist."); return; } in = new FileInputStream(file); out = new FileOutputStream(file); in.getChannel().lock(); // We will not use channel to release the lock, but close it. } public void release() throws IOException { in.close(); out.close(); } public boolean reserve() throws IOException { // use Scanner (java 1.5) to read integer value Scanner scanner = new Scanner(in); scanner.useDelimiter("\\s+"); if (!scanner.hasNext()) { return false; } int value = scanner.nextInt(); if (value--<=0) { return false; } // updated result have to be on the top of file // reset the position using FileChannel FileChannel chan = out.getChannel(); chan.position(0); // We cannot print utf-8 represented number using OutputStream, // so get PrinterWriter from the OutputStream PrintWriter print = new PrintWriter(out); print.println(value); print.flush(); // It may contains garbage after, shorten the file // just in case. chan.truncate(chan.position()); return true; } public String resource_name() { // bad name, but it's OK. return resource_path; } }