From JavaProgramming * A naming service binds objects to meaningful names * Many different namings services exists * JNDI is a Java interface to any underlying naming service * A directory service allows attributes to be defined for objects * Each attribute has an identifier and a value * Many different directory services exists * JNDI is a Java interface to directory services http://java.sun.com/products/jndi/images/jndiarch.jpg /* UseService.java */ import javax.naming.*; import java.io.File; import java.util.Hashtable; /** * Demonstrates the use of a JNDI service (Java Naming and Directory Interface) * Before using this program you must download a File System Server from * Sun at http://java.sun.com/products/jndi/serviceproviders.html * The donwloaded zip file should contain two jar files: * fscontext.jar and providerutil.jar * These files can be placed in \jre\lib\ext * thereby making the jar files available to the JVM without * needing to adjust the classpath * **/ class UseService { public static void main(String[] args) { // Set up the environment for creating the initial context Hashtable env = new Hashtable(); // Set up context for JNDI file system service env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); // This will allow you to inspect the folder c:\java env.put(Context.PROVIDER_URL, "file:/java"); // ctx must be initialised, when calling Context.close() in the finally block Context ctx = null; try { // Create the initial context // May generate NamingException ctx = new InitialContext(env); // Call lookup() on this object, to lookup a file relative to the // /java folder. // Cast return type from lookup() into a File type // May generate NamingException File file = (File)ctx.lookup("JNDI/UseService.java"); // For example, you can specify "JNDI/UseService.java" to // find out information about your current file (!). System.out.println("Length: " + file.length()); System.out.println("Can read: " + file.canRead()); // Output: // Length: xxxx // Can read: true } // Remember to catch any NamingExceptions and // display any error information on the console. catch (NamingException ex) { System.out.println(ex.getMessage()); } finally { try { // Allways close server connections in a finally block. // If close() is called in the try block it might not be called // when an exception occurs on a previous line. // Not closing the connection will leave dangling resources on the server // May generate NamingException ctx.close(); } catch (NamingException ex) { System.out.println(ex.getMessage()); } } } }