JNDI 学习笔记一

   JNDI全名是 JAVA Naming and Directory Interface,就是java命名和目录接口。它提供了一种绑定(bind)功能,具体的我也不是太清楚,可以通过一个名字来拿到一个对象。

   开始学习之前,当然要先下载它的相关jar包:可以到sun的网站上下载,同时可以下一个jndi tutorial,这里面介绍jndi挺不错的,我也是用它来学习的,虽然是英语,看起来也不是很难。

   第二步是下载它上面提供的service provider,先别管那是什么东西,把file和ldap的先下下来,其他的也用不到,等你把这两个弄清楚了,其他的也就差不多知道是什么东西了。

   准备好上面的东西之后,就可以开始jndi的学习啦!

   建立一个java project,把jndi用到的jar包导入;咱先来看一个比较简单的例子,就用你下下来的file的service provider,把它lib下的jar包导入的工程中。

   然后写一个如下的测试程序:

  import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;

import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;

/**
 *
 * 
 *基本的jndi方法 lookup()
 */
public class JNDINamingService_1 {

 public static void main(String[] args) {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
  env.put(Context.PROVIDER_URL, "file:./tmp/tutorial");
  
  try {
   Context ctx = new InitialContext(env);
      
   File file = (File)ctx.lookup("report.txt");
   
   BufferedReader br = new BufferedReader(new FileReader(file));
   String str = br.readLine();
   while (str!= null) {
    System.out.println(str);
    str = br.readLine();
   }
   System.out.println("success");
   
  } catch (NamingException e) {
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

}

 

解释一下程序中的几个地方:

Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
  env.put(Context.PROVIDER_URL, "file:./tmp/tutorial");
这很重要,主要是设置JNDI使用的环境参数,简单一点来说就是指定你用什么service provider,以及其提供的入口:

 com.sun.jndi.fscontext.RefFSContextFactory:是你导入的file service provider包中的一个类

 file:./tmp/tutorial: 是file service provider 的根目录吧,可以这么说

 

Context ctx = new InitialContext(env); -----初始化我们的Context,此时这个Context与这个目录 ./tmp/tutorial相绑定了(我个人这么认为的,有什么不正确的还请大家指出)

 

File file = (File)ctx.lookup("report.txt"); ----它会去上面的目录下找是否有名字叫report.txt的文件,如果没有会抛错;如果存在,它就返回它的File对象,我们就可以对这个File对象进行操作啦。

 

想让这个程序跑起来,你需要在你的工程目录下建立如下的目录tmp/tutorial/report.txt,文件里随便写点什么吧!
怎么样,看到效果了吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值