<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java &#38; Game &#187; java</title>
	<atom:link href="http://www.javagg.com/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javagg.com</link>
	<description>java&#38;j2me</description>
	<lastBuildDate>Sat, 02 Jul 2011 08:59:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java操作XML（使用org.w3c.dom）</title>
		<link>http://www.javagg.com/archives/829</link>
		<comments>http://www.javagg.com/archives/829#comments</comments>
		<pubDate>Sat, 27 Nov 2010 03:13:31 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.javagg.com/archives/829</guid>
		<description><![CDATA[一、创建DOM
view sourceprint?001 XMLBuilder.java  
 用于创建ＤＯＭ，Root结点  
/********************************************************************  
 * 项目名称    ：rochoc
 * 包名称      ：rochoc.xml.oper
 * 文件名称    ：XmlBuilder 
 * 编写者     ：luoc
 * 编写日期    ：2005-6-22
 * 程序功能（类）描述 ： 根据传入的XML文件生成Document和root结点
 *   
 * 程序变更日期  [...]]]></description>
			<content:encoded><![CDATA[<p>一、创建DOM</p>
<p>view sourceprint?001 XMLBuilder.java  </p>
<p> 用于创建ＤＯＭ，Root结点  </p>
<p>/********************************************************************  </p>
<p> * 项目名称    ：rochoc
<p> * 包名称      ：rochoc.xml.oper
<p> * 文件名称    ：XmlBuilder <span id="more-829"></span>
<p> * 编写者     ：luoc
<p> * 编写日期    ：2005-6-22
<p> * 程序功能（类）描述 ： 根据传入的XML文件生成Document和root结点
<p> *   </p>
<p> * 程序变更日期   ：  </p>
<p> * 变更作者    ：  </p>
<p> * 变更说明    ：  </p>
<p>********************************************************************/ </p>
<p>package rochoc.xml.oper;  </p>
<p>import java.io.File;  </p>
<p>import java.io.IOException;  </p>
<p>import javax.xml.parsers.DocumentBuilder;  </p>
<p>import javax.xml.parsers.DocumentBuilderFactory;  </p>
<p>import javax.xml.parsers.ParserConfigurationException;  </p>
<p>import org.apache.log4j.Logger;  </p>
<p>import org.w3c.dom.Document;  </p>
<p>import org.w3c.dom.Element;  </p>
<p>import org.xml.sax.SAXException;  </p>
<p>/**  </p>
<p> * 类名：XmlBuilder
<p> * 类描述：根据传入的XML文件生成Document和root结点
<p> * 编写者 ：luoc
<p> * 编写日期 ：2005-6-22
<p> * 主要public成员变量：
<p> * 主要public方法：
<p> **/ </p>
<p>public class XmlBuilder  </p>
<p>{  </p>
<p>    /**  </p>
<p>     *构造函数说明：
<p>     *参数说明：@param path
<p>    **/ </p>
<p>    public XmlBuilder(String path)  </p>
<p>    {  </p>
<p>        this.path=path;  </p>
<p>        init();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：init
<p>    * 方法功能：初始化函数
<p>    * 参数说明：
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public void init()  </p>
<p>    {  </p>
<p>        buildDocument();  </p>
<p>        buildRoot();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：buildDocument
<p>    * 方法功能：将XML文件生成Document
<p>    * 参数说明：
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    private void buildDocument()  </p>
<p>    {  </p>
<p>        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  </p>
<p>        try </p>
<p>        {  </p>
<p>            DocumentBuilder builder=factory.newDocumentBuilder();  </p>
<p>            logger.debug(&#8220;Construct document builder success.&#8221;);  </p>
<p>            doc=builder.parse(new File(path));              </p>
<p>            logger.debug(&#8220;Build xml document success.&#8221;);  </p>
<p>        }catch(ParserConfigurationException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Construct document builder error:&#8221;+e);  </p>
<p>        }catch(SAXException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Parse xml file error:&#8221;+e);  </p>
<p>        }catch(IOException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Read xml file error:&#8221;+e);  </p>
<p>        }  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：buildRoot
<p>    * 方法功能：生成XML的根结点
<p>    * 参数说明：
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    private void buildRoot()  </p>
<p>    {  </p>
<p>        root=doc.getDocumentElement();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @return 返回 doc。  </p>
<p>     */ </p>
<p>    public Document getDoc()  </p>
<p>    {  </p>
<p>        return doc;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @param doc 要设置的 doc。  </p>
<p>     */ </p>
<p>    public void setDoc(Document doc)  </p>
<p>    {  </p>
<p>        this.doc = doc;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @return 返回 path。  </p>
<p>     */ </p>
<p>    public String getPath()  </p>
<p>    {  </p>
<p>        return path;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @param path 要设置的 path。  </p>
<p>     */ </p>
<p>    public void setPath(String path)  </p>
<p>    {  </p>
<p>        this.path = path;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @return 返回 root。  </p>
<p>     */ </p>
<p>    public Element getRoot()  </p>
<p>    {  </p>
<p>        return root;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @param root 要设置的 root。  </p>
<p>     */ </p>
<p>    public void setRoot(Element root)  </p>
<p>    {  </p>
<p>        this.root = root;  </p>
<p>    }  </p>
<p>    /*全局变量*/ </p>
<p>    private String path=null;//xml文件路径  </p>
<p>    private Document doc=null;//xml文件对应的document  </p>
<p>    private Element root=null;//xml文件的根结点  </p>
<p>    private Logger logger=Logger.getLogger(getClass().getName());  </p>
<p>}<br />
二、查找，插入，删除，修改</p>
<p>view sourceprint?001 XmlOper.java  </p>
<p> 用于操作ＸＭＬ文件，包括查找、新增、删除、修改结点  </p>
<p> /********************************************************************  </p>
<p> * 项目名称    ：rochoc
<p> * 包名称      ：rochoc.xml.oper
<p> * 文件名称    ：XmlOper
<p> * 编写者     ：luoc
<p> * 编写日期    ：2005-6-22
<p> * 程序功能（类）描述 ： 对XML进行读写操作
<p> *   </p>
<p> * 程序变更日期   ：  </p>
<p> * 变更作者    ：  </p>
<p> * 变更说明    ：  </p>
<p>********************************************************************/ </p>
<p>package rochoc.xml.oper;  </p>
<p>import java.util.ArrayList;  </p>
<p>import org.apache.log4j.Logger;  </p>
<p>import org.w3c.dom.Document;  </p>
<p>import org.w3c.dom.Element;  </p>
<p>import org.w3c.dom.Node;  </p>
<p>import org.w3c.dom.NodeList;  </p>
<p>/**  </p>
<p> * 类名：XmlOper
<p> * 类描述：对XML文件进行读写操作,均为静态函数
<p> * 编写者 ：luoc
<p> * 编写日期 ：2005-6-22
<p> * 主要public成员变量：
<p> * 主要public方法：
<p> **/ </p>
<p>public class XmlOper  </p>
<p>{  </p>
<p>    /**  </p>
<p>     *构造函数说明：
<p>     *参数说明：
<p>    **/ </p>
<p>    private XmlOper()  </p>
<p>    {          </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：getNodeList
<p>    * 方法功能：获取父结点parent的所有子结点
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@return
<p>    * 返回：NodeList
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static NodeList getNodeList(Element parent)  </p>
<p>    {  </p>
<p>        return parent.getChildNodes();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：getElementsByName
<p>    * 方法功能：在父结点中查询指定名称的结点集
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param name  </p>
<p>    * 参数说明：@return
<p>    * 返回：Element[]
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static Element [] getElementsByName(Element parent,String name)  </p>
<p>    {  </p>
<p>        ArrayList resList=new ArrayList();  </p>
<p>        NodeList nl=getNodeList(parent);  </p>
<p>        for(int i=0;i<nl.getLength();i++)  </p>
<p>        {  </p>
<p>            Node nd=nl.item(i);  </p>
<p>            if(nd.getNodeName().equals(name))  </p>
<p>            {  </p>
<p>                resList.add(nd);  </p>
<p>            }  </p>
<p>        }  </p>
<p>        Element [] res=new Element [resList.size()];  </p>
<p>        for(int i=0;i<resList.size();i++)  </p>
<p>        {  </p>
<p>            res[0]=(Element)resList.get(i);  </p>
<p>        }          </p>
<p>        logger.debug(parent.getNodeName()+"'s children of "+name+  </p>
<p>                "'s num:"+res.length);  </p>
<p>        return res;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：getElementName
<p>    * 方法功能：获取指定Element的名称
<p>    * 参数说明：@param element  </p>
<p>    * 参数说明：@return
<p>    * 返回：String
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static String getElementName(Element element)  </p>
<p>    {  </p>
<p>        return element.getNodeName();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：getElementValue
<p>    * 方法功能：获取指定Element的值
<p>    * 参数说明：@param element  </p>
<p>    * 参数说明：@return
<p>    * 返回：String
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static String getElementValue(Element element)  </p>
<p>    {  </p>
<p>        NodeList nl=element.getChildNodes();  </p>
<p>        for(int i=0;i<nl.getLength();i++)  </p>
<p>        {  </p>
<p>            if(nl.item(i).getNodeType()==Node.TEXT_NODE)//是一个Text Node  </p>
<p>            {              </p>
<p>                logger.debug(element.getNodeName()+" has a Text Node.");  </p>
<p>                return element.getFirstChild().getNodeValue();  </p>
<p>            }  </p>
<p>        }     </p>
<p>        logger.error(element.getNodeName()+" hasn't a Text Node.");  </p>
<p>        return null;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：getElementAttr
<p>    * 方法功能：获取指定Element的属性attr的值
<p>    * 参数说明：@param element  </p>
<p>    * 参数说明：@param attr  </p>
<p>    * 参数说明：@return
<p>    * 返回：String
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static String getElementAttr(Element element,String attr)  </p>
<p>    {  </p>
<p>        return element.getAttribute(attr);  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：setElementValue
<p>    * 方法功能：设置指定Element的值
<p>    * 参数说明：@param element  </p>
<p>    * 参数说明：@param val
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void setElementValue(Element element,String val)  </p>
<p>    {  </p>
<p>        Node node=element.getOwnerDocument().createTextNode(val);  </p>
<p>        NodeList nl=element.getChildNodes();  </p>
<p>        for(int i=0;i<nl.getLength();i++)  </p>
<p>        {  </p>
<p>            Node nd=nl.item(i);  </p>
<p>            if(nd.getNodeType()==Node.TEXT_NODE)//是一个Text Node  </p>
<p>            {              </p>
<p>                  nd.setNodeValue(val);  </p>
<p>                  logger.debug("modify "+element.getNodeName()+"'s node value succe.");  </p>
<p>                  return;  </p>
<p>            }  </p>
<p>        }     </p>
<p>        logger.debug("new "+element.getNodeName()+"'s node value succe.");  </p>
<p>        element.appendChild(node);          </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：setElementAttr
<p>    * 方法功能：设置结点Element的属性
<p>    * 参数说明：@param element  </p>
<p>    * 参数说明：@param attr  </p>
<p>    * 参数说明：@param attrVal
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void setElementAttr(Element element,  </p>
<p>            String attr,String attrVal)  </p>
<p>    {  </p>
<p>        element.setAttribute(attr,attrVal);  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：addElement
<p>    * 方法功能：在parent下增加结点child
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param child
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void addElement(Element parent,Element child)  </p>
<p>    {  </p>
<p>        parent.appendChild(child);  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：addElement
<p>    * 方法功能：在parent下增加字符串tagName生成的结点
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param tagName
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void addElement(Element parent,String tagName)  </p>
<p>    {          </p>
<p>        Document doc=parent.getOwnerDocument();  </p>
<p>        Element child=doc.createElement(tagName);  </p>
<p>        parent.appendChild(child);  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：addElement
<p>    * 方法功能：在parent下增加tagName的Text结点，且值为text
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param tagName  </p>
<p>    * 参数说明：@param text
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void addElement(Element parent,String tagName,String text)  </p>
<p>    {  </p>
<p>        Document doc=parent.getOwnerDocument();  </p>
<p>        Element child=doc.createElement(tagName);  </p>
<p>        setElementValue(child,text);  </p>
<p>        parent.appendChild(child);  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：removeElement
<p>    * 方法功能：将父结点parent下的名称为tagName的结点移除
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param tagName
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public static void removeElement(Element parent,String tagName)  </p>
<p>    {  </p>
<p>        logger.debug(&#8220;remove &#8220;+parent.getNodeName()+&#8221;&#8217;s children by tagName &#8220;+tagName+&#8221; begin&#8230;&#8221;);  </p>
<p>        NodeList nl=parent.getChildNodes();  </p>
<p>        for(int i=0;i<nl.getLength();i++)  </p>
<p>        {  </p>
<p>            Node nd=nl.item(i);  </p>
<p>            if(nd.getNodeName().equals(tagName))  </p>
<p>            {  </p>
<p>                parent.removeChild(nd);  </p>
<p>                logger.debug("remove child '"+nd+"' success.");  </p>
<p>            }  </p>
<p>        }  </p>
<p>        logger.debug("remove "+parent.getNodeName()+"'s children by tagName "+tagName+" end.");  </p>
<p>    }  </p>
<p>    /*全局变量*/     </p>
<p>    static Logger logger=Logger.getLogger("XmlOper");  </p>
<p>}<br />
三、新建XML文件</p>
<p>view sourceprint?001 XmlCreater.java  </p>
<p>  用于创建ＸＭＬ文件  </p>
<p> /********************************************************************  </p>
<p>  * 项目名称    ：rochoc
<p>  * 包名称      ：rochoc.xml.oper
<p>  * 文件名称    ：XmlCreater
<p>  * 编写者     ：luoc
<p>  * 编写日期    ：2005-6-22
<p>  * 程序功能（类）描述 ： 创建DOM并生成XML文件
<p>  *   </p>
<p>  * 程序变更日期   ：  </p>
<p>  * 变更作者    ：  </p>
<p>  * 变更说明    ：  </p>
<p> ********************************************************************/ </p>
<p> package rochoc.xml.oper;  </p>
<p> import java.io.File;  </p>
<p> import javax.xml.parsers.DocumentBuilder;  </p>
<p> import javax.xml.parsers.DocumentBuilderFactory;  </p>
<p> import javax.xml.parsers.ParserConfigurationException;  </p>
<p> import javax.xml.transform.Transformer;  </p>
<p> import javax.xml.transform.TransformerConfigurationException;  </p>
<p> import javax.xml.transform.TransformerException;  </p>
<p> import javax.xml.transform.TransformerFactory;  </p>
<p> import javax.xml.transform.dom.DOMSource;  </p>
<p> import javax.xml.transform.stream.StreamResult;  </p>
<p> import org.apache.log4j.Logger;  </p>
<p> import org.w3c.dom.Document;  </p>
<p> import org.w3c.dom.Element;  </p>
<p> /**  </p>
<p>  * 类名：XmlCreater
<p>  * 类描述： 创建DOM并生成XML文件
<p>  * 编写者 ：luoc
<p>  * 编写日期 ：2005-6-22
<p>  * 主要public成员变量：
<p>  * 主要public方法：
<p>  **/ </p>
<p> public class XmlCreater  </p>
<p>{  </p>
<p>    /**  </p>
<p>     *构造函数说明：
<p>     *参数说明：@param path  xml文件路径
<p>    **/ </p>
<p>    public XmlCreater(String path)  </p>
<p>    {  </p>
<p>        this.path=path;  </p>
<p>        init();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：init
<p>    * 方法功能： 初始化函数
<p>    * 参数说明：
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    private void init()  </p>
<p>    {  </p>
<p>        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  </p>
<p>        try </p>
<p>        {  </p>
<p>            DocumentBuilder builder=factory.newDocumentBuilder();  </p>
<p>            doc=builder.newDocument();//新建DOM  </p>
<p>        }catch(ParserConfigurationException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Parse DOM builder error:&#8221;+e);  </p>
<p>        }  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：createRootElement
<p>    * 方法功能：创建根结点，并返回
<p>    * 参数说明：@param rootTagName
<p>    * 返回：Element
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public Element createRootElement(String rootTagName)  </p>
<p>    {       </p>
<p>        if(doc.getDocumentElement()==null)  </p>
<p>        {  </p>
<p>            logger.debug(&#8220;create root element &#8216;&#8221;+rootTagName+&#8221;&#8216; success.&#8221;);  </p>
<p>            Element root=doc.createElement(rootTagName);  </p>
<p>            doc.appendChild(root);  </p>
<p>            return root;  </p>
<p>        }  </p>
<p>        logger.warn(&#8220;this dom&#8217;s root element is exist,create fail.&#8221;);  </p>
<p>        return doc.getDocumentElement();  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：createElement
<p>    * 方法功能：在parent结点下增加子结点tagName
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param tagName
<p>    * 返回：Element
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public Element createElement(Element parent,String tagName)  </p>
<p>    {  </p>
<p>        Document doc=parent.getOwnerDocument();  </p>
<p>        Element child=doc.createElement(tagName);  </p>
<p>        parent.appendChild(child);          </p>
<p>        return child;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：createElement
<p>    * 方法功能：在parent结点下增加值为value的子结点tabName
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param tagName  </p>
<p>    * 参数说明：@param value
<p>    * 返回：Element
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public Element createElement(Element parent,String tagName,String value)  </p>
<p>    {  </p>
<p>        Document doc=parent.getOwnerDocument();  </p>
<p>        Element child=doc.createElement(tagName);  </p>
<p>        XmlOper.setElementValue(child,value);  </p>
<p>        parent.appendChild(child);  </p>
<p>        return child;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：createAttribute
<p>    * 方法功能：在parent结点下增加属性
<p>    * 参数说明：@param parent  </p>
<p>    * 参数说明：@param attrName 属性名  </p>
<p>    * 参数说明：@param attrValue 属性值
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public void createAttribute(Element parent,String attrName,String attrValue)  </p>
<p>    {  </p>
<p>        XmlOper.setElementAttr(parent,attrName,attrValue);          </p>
<p>    }  </p>
<p>    /**  </p>
<p>    * 方法名称：buildXmlFile
<p>    * 方法功能：根据DOM生成XML文件
<p>    * 参数说明：
<p>    * 返回：void
<p>    * 作者：luoc  </p>
<p>    * 日期：2005-6-22  </p>
<p>    **/ </p>
<p>    public void buildXmlFile()  </p>
<p>    {  </p>
<p>        TransformerFactory tfactory=TransformerFactory.newInstance();  </p>
<p>        try </p>
<p>        {  </p>
<p>            Transformer transformer=tfactory.newTransformer();  </p>
<p>            DOMSource source=new DOMSource(doc);  </p>
<p>            logger.debug(&#8220;New DOMSource success.&#8221;);  </p>
<p>            StreamResult result=new StreamResult(new File(path));  </p>
<p>            logger.debug(&#8220;New StreamResult success.&#8221;);  </p>
<p>            transformer.setOutputProperty(&#8220;encoding&#8221;,&#8221;GBK&#8221;);  </p>
<p>            transformer.transform(source,result);  </p>
<p>            logger.debug(&#8220;Build XML File &#8216;&#8221;+path+&#8221;&#8216; success.&#8221;);  </p>
<p>        }catch(TransformerConfigurationException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Create Transformer error:&#8221;+e);  </p>
<p>        }catch(TransformerException e)  </p>
<p>        {  </p>
<p>            logger.error(&#8220;Transformer XML file error:&#8221;+e);  </p>
<p>        }  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @return 返回 doc。  </p>
<p>     */ </p>
<p>    public Document getDoc()  </p>
<p>    {  </p>
<p>        return doc;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @param doc 要设置的 doc。  </p>
<p>     */ </p>
<p>    public void setDoc(Document doc)  </p>
<p>    {  </p>
<p>        this.doc = doc;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @return 返回 path。  </p>
<p>     */ </p>
<p>    public String getPath()  </p>
<p>    {  </p>
<p>        return path;  </p>
<p>    }  </p>
<p>    /**  </p>
<p>     * @param path 要设置的 path。  </p>
<p>     */ </p>
<p>    public void setPath(String path)  </p>
<p>    {  </p>
<p>        this.path = path;  </p>
<p>    }  </p>
<p>    /*全局变量*/ </p>
<p>    private Logger logger = Logger.getLogger(getClass().getName());  </p>
<p>    private Document doc=null;//新创建的DOM  </p>
<p>    private String path=null;//生成的XML文件绝对路径  </p>
<p>} </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/829/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comet 10w + 连接打开测试</title>
		<link>http://www.javagg.com/archives/804</link>
		<comments>http://www.javagg.com/archives/804#comments</comments>
		<pubDate>Fri, 09 Jul 2010 04:27:18 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[netty]]></category>
		<category><![CDATA[nio]]></category>

		<guid isPermaLink="false">http://www.javagg.com/archives/804</guid>
		<description><![CDATA[Comet是一个时髦词语，象ajax一样，非常Cool。Comet的主要作用是，服务器可以把新数据主动传送给客户端。 
我认为，Comet将是下一波互联网应用更新潮的主流.象google wave使用Comet一样，实现实时更新. 
Plurkr 的增长速度非常快，我们正在成为最大的Python网站之一，我们的每天都有10w+的在线用户。
我们大约用了一个星期寻找不同的解决方案.
以下是我积累的一些技术资料：
Python Twisted: 无阻塞的Python服务器。遗憾的是吃了很多的CPU，不能规模化应用。
Jetty: 他们声称对Comet有良好的支持，我们运行1w个活跃用户约点2GB的内存，这是我们不能接受的。
Apache Tomcat: 和Jetty有点象，同样需要非常多的内存.
Apache Mina: 一个NIO的（非阻塞的IO）的框架，我用来建立一个HTTP服务器。不幸的是mina严重缺小文档，我们并没有大规模测试了。
这些尝试后，发现了，他们无法处理大量的负载,我正要放弃。 但后来，我偶然发现后救世主：  
 JBoss Netty: 一个NIO的（非阻塞的IO）的框架, 创始人是Apache mina的原作者，它的设计很出色，和其它的服务器对比过后，发现他的并发相当惊人的.
 最低标准
 我们使用Netty 打开10w+的comet连接，在一台四核的服务器上只使用了数GB的内存和20%的cpu。也就是说，我们已经解决了C10k * 10 问题使用非阻塞技术和一些非常令人印象深刻的库（即Java NIO的和Netty）。 
一个大的荣誉是属于 Trustin Lee 对他的Netty惊人的工作！ 
 原文:http://amix.dk/blog/post/19456
]]></description>
			<content:encoded><![CDATA[<p>Comet是一个时髦词语，象ajax一样，非常Cool。Comet的主要作用是，服务器可以把新数据主动传送给客户端。 </p>
<p>我认为，Comet将是下一波互联网应用更新潮的主流.象google wave使用Comet一样，实现实时更新. </p>
<p>Plurkr 的增长速度非常快，我们正在成为最大的Python网站之一，我们的每天都有10w+的在线用户。<br />
我们大约用了一个星期寻找不同的解决方案.<span id="more-804"></span></p>
<p>以下是我积累的一些技术资料：</p>
<p><a href="http://twistedmatrix.com/trac/">Python Twisted</a>: 无阻塞的Python服务器。遗憾的是吃了很多的CPU，不能规模化应用。</p>
<p><a href="http://www.oschina.net/p/jetty">Jetty</a>: 他们声称对Comet有良好的支持，我们运行1w个活跃用户约点2GB的内存，这是我们不能接受的。</p>
<p><a href="http://www.oschina.net/p/tomcat">Apache Tomcat</a>: 和Jetty有点象，同样需要非常多的内存.</p>
<p><a href="http://www.oschina.net/p/mina">Apache Mina</a>: 一个NIO的（非阻塞的IO）的框架，我用来建立一个HTTP服务器。不幸的是mina严重缺小文档，我们并没有大规模测试了。</p>
<p>这些尝试后，发现了，他们无法处理大量的负载,我正要放弃。 但后来，我偶然发现后救世主：  </p>
<p> <a href="http://www.oschina.net/p/netty">JBoss Netty</a>: 一个NIO的（非阻塞的IO）的框架, 创始人是Apache mina的原作者，它的设计很出色，和其它的服务器对比过后，发现他的并发相当惊人的.</p>
<p> <strong>最低标准</strong></p>
<p><strong> </strong>我们使用Netty 打开10w+的comet连接，在一台四核的服务器上只使用了数GB的内存和20%的cpu。也就是说，我们已经解决了<a href="http://www.kegel.com/c10k.html" target="_blank">C10k * 10</a> 问题使用非阻塞技术和一些非常令人印象深刻的库（即Java NIO的和Netty）。 </p>
<p>一个大的荣誉是属于 <a href="http://gleamynode.net/" target="_blank">Trustin Lee</a> 对他的Netty惊人的工作！ </p>
<p> 原文:http://amix.dk/blog/post/19456</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/804/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>了解Class loader</title>
		<link>http://www.javagg.com/archives/712</link>
		<comments>http://www.javagg.com/archives/712#comments</comments>
		<pubDate>Wed, 31 Mar 2010 09:42:19 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Classloader]]></category>
		<category><![CDATA[JVM]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=712</guid>
		<description><![CDATA[Java ClassLoader 是一个重要的、但又常常被人忽略的 Java 运行时系统组件。它是负责在运行时查找和装入类文件的类。创建自己的 ClassLoader 可以以实用且有趣的方式定制 JVM，这样可以让您彻底重新定义如何将类文件引入系统。
本教程概述了 Java ClassLoader，并指导您构造在装入代码之前自动编译代码的示例 ClassLoader。您将完全了解 ClassLoader 的功能以及创建自己的 ClassLoader 需要执行的操作。
在学习本教程前，需了解一些 Java 编程的基本知识，包括创建、编译和执行简单的命令行 Java 程序的技能，以及掌握一些类文件范例的知识。
在学完本教程后，您会知道如何：
* 扩展 JVM 的功能
* 创建定制的 ClassLoader
* 了解如何将定制的 ClassLoader 集成到 Java 应用程序
* 修改您的 ClassLoader，从而能适合 Java 2 发行版
什么是 ClassLoader?
在流行的商业化编程语言中，Java 语言由于在 Java 虚拟机 (JVM) 上运行而显得与众不同。这意味着已编译的程序是一种特殊的、独立于平台的格式，并非依赖于它们所运行的机器。在很大程度上，这种格式不同于传统的可执行程序格式。
与 C 或 C++ 编写的程序不同，Java 程序并不是一个可执行文件，而是由许多独立的类文件组成，每一个文件对应于一个 Java 类。
此外，这些类文件并非立即全部都装入内存，而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。
而且，Java ClassLoader 就是用 Java 语言编写的。这意味着创建您自己的 ClassLoader [...]]]></description>
			<content:encoded><![CDATA[<p>Java ClassLoader 是一个重要的、但又常常被人忽略的 Java 运行时系统组件。它是负责在运行时查找和装入类文件的类。创建自己的 ClassLoader 可以以实用且有趣的方式定制 JVM，这样可以让您彻底重新定义如何将类文件引入系统。</p>
<p>本教程概述了 Java ClassLoader，并指导您构造在装入代码之前自动编译代码的示例 ClassLoader。您将完全了解 ClassLoader 的功能以及创建自己的 ClassLoader 需要执行的操作。<span id="more-712"></span></p>
<p>在学习本教程前，需了解一些 Java 编程的基本知识，包括创建、编译和执行简单的命令行 Java 程序的技能，以及掌握一些类文件范例的知识。<br />
在学完本教程后，您会知道如何：<br />
* 扩展 JVM 的功能<br />
* 创建定制的 ClassLoader<br />
* 了解如何将定制的 ClassLoader 集成到 Java 应用程序<br />
* 修改您的 ClassLoader，从而能适合 Java 2 发行版</p>
<p>什么是 ClassLoader?<br />
在流行的商业化编程语言中，Java 语言由于在 Java 虚拟机 (JVM) 上运行而显得与众不同。这意味着已编译的程序是一种特殊的、独立于平台的格式，并非依赖于它们所运行的机器。在很大程度上，这种格式不同于传统的可执行程序格式。<br />
与 C 或 C++ 编写的程序不同，Java 程序并不是一个可执行文件，而是由许多独立的类文件组成，每一个文件对应于一个 Java 类。<br />
此外，这些类文件并非立即全部都装入内存，而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。<br />
而且，Java ClassLoader 就是用 Java 语言编写的。这意味着创建您自己的 ClassLoader 非常容易，不必了解 JVM 的微小细节。<br />
为什么编写 ClassLoader?	 第 2 页（共 4 页）<br />
如果 JVM 已经有一个 ClassLoader，那么为什么还要编写另一个呢？问得好。缺省的 ClassLoader 只知道如何从本地文件系统装入类文件。不过这只适合于常规情况，即已全部编译完 Java 程序，并且计算机处于等待状态。<br />
但 Java 语言最具新意的事就是 JVM 可以非常容易地从那些非本地硬盘或从网络上获取类。例如，浏览者可以使用定制的 ClassLoader 从 Web 站点装入可执行内容。<br />
有许多其它方式可以获取类文件。除了简单地从本地或网络装入文件以外，可以使用定制的 ClassLoader 完成以下任务：<br />
* 在执行非置信代码之前，自动验证数字签名<br />
* 使用用户提供的密码透明地解密代码<br />
* 动态地创建符合用户特定需要的定制化构建类<br />
任何您认为可以生成 Java 字节码的内容都可以集成到应用程序中。<br />
定制 ClassLoader 示例	第 3 页（共 4 页）<br />
如果使用过 JDK 或任何基于 Java 浏览器中的 Applet 查看器，那么您差不多肯定使用过定制的 ClassLoader。<br />
Sun 最初发布 Java 语言时，其中最令人兴奋的一件事是观看这项新技术是如何执行在运行时从远程的 Web 服务器装入的代码。（此外，还有更令人兴奋的事 &#8212; Java 技术提供了一种便于编写代码的强大语言。）更一些令人激动的是它可以执行从远程 Web 服务器通过 HTTP 连接发送过来的字节码。<br />
此项功能归功于 Java 语言可以安装定制 ClassLoader。Applet 查看器包含一个 ClassLoader，它不在本地文件系统中寻找类，而是访问远程服务器上的 Web 站点，经过 HTTP 装入原始的字节码文件，并把它们转换成 JVM 内的类。<br />
浏览器和 Applet 查看器中的 ClassLoaders 还可以做其它事情：它们支持安全性以及使不同的 Applet 在不同的页面上运行而互不干扰。<br />
Luke Gorrie 编写的 Echidna 是一个开放源码包，它可以使您在单个虚拟机上运行多个 Java 应用程序。（请参阅进一步了解和参考资料。）它使用定制的 ClassLoader，通过向每个应用程序提供该类文件的自身副本，以防止应用程序互相干扰。<br />
我们的 ClassLoader 示例	 第 4 页（共 4 页）<br />
了解了 ClassLoader 如何工作以及如何编写 ClassLoader 之后，我们将创建称作 CompilingClassLoader (CCL) 的 Classloader。CCL 为我们编译 Java 代码，而无需要我们干涉这个过程。它基本上就类似于直接构建到运行时系统中的 &#8220;make&#8221; 程序。<br />
注：进一步了解之前，应注意在 JDK 版本 1.2 中已改进了 ClassLoader 系统的某些方面（即 Java 2 平台）。本教程是按 JDK 版本 1.0 和 1.1 写的，但也可以在以后的版本中运行。<br />
Java 2 中 ClassLoader 的变动描述了 Java 版本 1.2 中的变动，并提供了一些详细信息，以便修改 ClassLoader 来利用这些变动。<br />
Classloader 结构<br />
ClassLoader 的基本目标是对类的请求提供服务。当 JVM 需要使用类时，它根据名称向 ClassLoader 请求这个类，然后 ClassLoader 试图返回一个表示这个类的 Class 对象。<br />
通过覆盖对应于这个过程不同阶段的方法，可以创建定制的 ClassLoader。<br />
在本章的其余部分，您会学习 Java ClassLoader 的关键方法。您将了解每一个方法的作用以及它是如何适合装入类文件这个过程的。您也会知道，创建自己的 ClassLoader 时，需要编写什么代码。<br />
方法 loadClass	 第 2 页（共 8 页）<br />
ClassLoader.loadClass() 是 ClassLoader 的入口点。其特征如下：<br />
Class loadClass( String name, boolean resolve );<br />
name 参数指定了 JVM 需要的类的名称，该名称以包表示法表示，如 Foo 或 java.lang.Object。<br />
resolve 参数告诉方法是否需要解析类。在准备执行类之前，应考虑类解析。并不总是需要解析。如果 JVM 只需要知道该类是否存在或找出该类的超类，那么就不需要解析。<br />
在 Java 版本 1.1 和以前的版本中，loadClass 方法是创建定制的 ClassLoader 时唯一需要覆盖的方法。（Java 2 中 ClassLoader 的变动提供了关于 Java 1.2 中 findClass() 方法的信息。）<br />
方法 defineClass<br />
defineClass 方法是 ClassLoader 的主要诀窍。该方法接受由原始字节组成的数组并把它转换成 Class 对象。原始数组包含如从文件系统或网络装入的数据。<br />
defineClass 管理 JVM 的许多复杂、神秘和倚赖于实现的方面 &#8212; 它把字节码分析成运行时数据结构、校验有效性等等。不必担心，您无需亲自编写它。事实上，即使您想要这么做也不能覆盖它，因为它已被标记成最终的。<br />
方法 findSystemClass<br />
findSystemClass 方法从本地文件系统装入文件。它在本地文件系统中寻找类文件，如果存在，就使用 defineClass 将原始字节转换成 Class 对象，以将该文件转换成类。当运行 Java 应用程序时，这是 JVM 正常装入类的缺省机制。（Java 2 中 ClassLoader 的变动提供了关于 Java 版本 1.2 这个过程变动的详细信息。）<br />
对于定制的 ClassLoader，只有在尝试其它方法装入类之后，再使用 findSystemClass。原因很简单：ClassLoader 是负责执行装入类的特殊步骤，不是负责所有类。例如，即使 ClassLoader 从远程的 Web 站点装入了某些类，仍然需要在本地机器上装入大量的基本 Java 库。而这些类不是我们所关心的，所以要 JVM 以缺省方式装入它们：从本地文件系统。这就是 findSystemClass 的用途。<br />
其工作流程如下：<br />
* 请求定制的 ClassLoader 装入类。<br />
* 检查远程 Web 站点，查看是否有所需要的类。<br />
* 如果有，那么好；抓取这个类，完成任务。<br />
* 如果没有，假定这个类是在基本 Java 库中，那么调用 findSystemClass，使它从文件系统装入该类。<br />
在大多数定制 ClassLoaders 中，首先调用 findSystemClass 以节省在本地就可以装入的许多 Java 库类而要在远程 Web 站点上查找所花的时间。然而，正如，在下一章节所看到的，直到确信能自动编译我们的应用程序代码时，才让 JVM 从本地文件系统装入类。<br />
方法 resolveClass<br />
正如前面所提到的，可以不完全地（不带解析）装入类，也可以完全地（带解析）装入类。当编写我们自己的 loadClass 时，可以调用 resolveClass，这取决于 loadClass 的 resolve 参数的值。<br />
方法 findLoadedClass<br />
findLoadedClass 充当一个缓存：当请求 loadClass 装入类时，它调用该方法来查看 ClassLoader 是否已装入这个类，这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。<br />
组装<br />
让我们看一下如何组装所有方法。<br />
我们的 loadClass 实现示例执行以下步骤。（这里，我们没有指定生成类文件是采用了哪种技术 &#8212; 它可以是从 Net 上装入、或者从归档文件中提取、或者实时编译。无论是哪一种，那是种特殊的神奇方式，使我们获得了原始类文件字节。）<br />
* 调用 findLoadedClass 来查看是否存在已装入的类。<br />
* 如果没有，那么采用那种特殊的神奇方式来获取原始字节。<br />
* 如果已有原始字节，调用 defineClass 将它们转换成 Class 对象。<br />
* 如果没有原始字节，然后调用 findSystemClass 查看是否从本地文件系统获取类。<br />
* 如果 resolve 参数是 true，那么调用 resolveClass 解析 Class 对象。<br />
* 如果还没有类，返回 ClassNotFoundException。<br />
* 否则，将类返回给调用程序。<br />
CCL 揭密<br />
我们的 ClassLoader (CCL) 的任务是确保代码被编译和更新。<br />
下面描述了它的工作方式：<br />
* 当请求一个类时，先查看它是否在磁盘的当前目录或相应的子目录。<br />
* 如果该类不存在，但源码中有，那么调用 Java 编译器来生成类文件。<br />
* 如果该类已存在，检查它是否比源码旧。如果是，调用 Java 编译器来重新生成类文件。<br />
* 如果编译失败，或者由于其它原因不能从现有的源码中生成类文件，返回 ClassNotFoundException。<br />
* 如果仍然没有该类，也许它在其它库中，所以调用 findSystemClass 来寻找该类。<br />
* 如果还是没有，则返回 ClassNotFoundException。<br />
* 否则，返回该类。<br />
Java 编译的工作方式	 第 2 页（共 4 页）<br />
在深入讨论之前，应该先退一步，讨论 Java 编译。通常，Java 编译器不只是编译您要求它编译的类。它还会编译其它类，如果这些类是您要求编译的类所需要的类。<br />
CCL 逐个编译应用程序中的需要编译的每一个类。但一般来说，在编译器编译完第一个类后，CCL 会查找所有需要编译的类，然后编译它。为什么？Java 编译器类似于我们正在使用的规则：如果类不存在，或者与它的源码相比，它比较旧，那么它需要编译。其实，Java 编译器在 CCL 之前的一个步骤，它会做大部分的工作。<br />
当 CCL 编译它们时，会报告它正在编译哪个应用程序上的类。在大多数的情况下，CCL 会在程序中的主类上调用编译器，它会做完所有要做的 &#8212; 编译器的单一调用已足够了。<br />
然而，有一种情形，在第一步时不会编译某些类。如果使用 Class.forName 方法，通过名称来装入类，Java 编译器会不知道这个类时所需要的。在这种情况下，您会看到 CCL 再次运行 Java 编译器来编译这个类。在源代码中演示了这个过程。<br />
使用 CompilationClassLoader<br />
要使用 CCL，必须以特殊方式调用程序。不能直接运行该程序，如：<br />
% java Foo arg1 arg2<br />
应以下列方式运行它：<br />
% java CCLRun Foo arg1 arg2<br />
CCLRun 是一个特殊的存根程序，它创建 CompilingClassLoader 并用它来装入程序的主类，以确保通过 CompilingClassLoader 来装入整个程序。CCLRun 使用 Java Reflection API 来调用特定类的主方法并把参数传递给它。有关详细信息，请参阅源代码。<br />
运行示例	 第 4 页（共 4 页）<br />
源码包括了一组小类，它们演示了工作方式。主程序是 Foo 类，它创建类 Bar 的实例。类 Bar 创建另一个类 Baz 的实例，它在 baz 包内，这是为了展示 CCL 是如何处理子包里的代码。Bar 也是通过名称装入的，其名称为 Boo，这用来展示它也能与 CCL 工作。<br />
每个类都声明已被装入并运行。现在用源代码来试一下。编译 CCLRun 和 CompilingClassLoader。确保不要编译其它类（Foo、Bar、Baz 和 Boo），否则将不会使用 CCL，因为这些类已经编译过了。<br />
% java CCLRun Foo arg1 arg2<br />
CCL: Compiling Foo.java&#8230;<br />
foo! arg1 arg2<br />
bar! arg1 arg2<br />
baz! arg1 arg2<br />
CCL: Compiling Boo.java&#8230;<br />
Boo!<br />
请注意，首先调用编译器，Foo.java 管理 Bar 和 baz.Baz。直到 Bar 通过名称来装入 Boo 时，被调用它，这时 CCL 会再次调用编译器来编译它。<br />
概述<br />
在 Java 版本 1.2 和以后的版本中，对 ClassLoader 做了一些改进。任何为老系统编写的代码可以在新版本中运行，但新系统为您提供了一些便利。<br />
新模型是委托模型，这意味着如果 ClassLoader 不能找到类，它会请求父代 ClassLoader 来执行此项任务。所有 ClassLoaders 的根是系统 ClassLoader，它会以缺省方式装入类 &#8212; 即，从本地文件系统。<br />
loadClass 的缺省实现<br />
定制编写的 loadClass 方法一般尝试几种方式来装入所请求的类，如果您编写许多类，会发现一次次地在相同的、很复杂的方法上编写变量。<br />
在 Java 1.2 中 loadClass 的实现嵌入了大多数查找类的一般方法，并使您通过覆盖 findClass 方法来定制它，在适当的时候 findClass 会调用 loadClass。<br />
这种方式的好处是您可能不一定要覆盖 loadClass；只要覆盖 findClass 就行了，这减少了工作量。<br />
新方法：findClass<br />
loadClass 的缺省实现调用这个新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代码，而无需要复制其它代码（例如，当专门的方法失败时，调用系统 ClassLoader）。<br />
CompilingClassLoader.java<br />
以下是 CompilingClassLoader.java 的源代码</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// $Id$</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.io.*;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">A CompilingClassLoader compiles your Java source on-the-fly. &nbsp;It checks</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">for nonexistent .class files, or .class files that are older than their</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">corresponding source code.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> CompilingClassLoader <span class="kw2">extends</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AClassLoader+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ClassLoader</span></a></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Given a filename, read the entirety of that file from disk</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// and return it as a byte array.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> getBytes<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> filename <span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Find out the length of the file</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a> file = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a><span class="br0">&#40;</span> filename <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">long</span> len = file.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Create an array that&#8217;s just the right size for the file&#8217;s</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// contents</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">byte</span> raw<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>len<span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Open the file</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFileInputStream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">FileInputStream</span></a> fin = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFileInputStream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">FileInputStream</span></a><span class="br0">&#40;</span> file <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Read all of it into the array; if we don&#8217;t get all,</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// then it&#8217;s an error.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> r = fin.<span class="me1">read</span><span class="br0">&#40;</span> raw <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>r != len<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">throw</span> <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Can&#8217;t read all, &quot;</span>+r+<span class="st0">&quot; != &quot;</span>+len <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Don&#8217;t forget to close the file!</span></div>
</li>
<li class="li1">
<div class="de1">fin.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// And finally return the file contents as an array</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> raw;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Spawn a process to compile the java source code file</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// specified in the &#8216;javaFile&#8217; parameter. &nbsp;Return a true if</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// the compilation worked, false otherwise.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">private</span> <span class="kw4">boolean</span> compile<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> javaFile <span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Let the user know what&#8217;s going on</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> <span class="st0">&quot;CCL: Compiling &quot;</span>+javaFile+<span class="st0">&quot;&#8230;&quot;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Start up the compiler</span></div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AProcess+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Process</span></a> p = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ARuntime+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Runtime</span></a>.<span class="me1">getRuntime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">exec</span><span class="br0">&#40;</span> <span class="st0">&quot;javac &quot;</span>+javaFile <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Wait for it to finish running</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">p.<span class="me1">waitFor</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> <span class="kw2">catch</span><span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInterruptedException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InterruptedException</span></a> ie <span class="br0">&#41;</span> <span class="br0">&#123;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> ie <span class="br0">&#41;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Check the return code, in case of a compilation error</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> ret = p.<span class="me1">exitValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Tell whether the compilation worked</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> ret==<span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// The heart of the ClassLoader &#8212; automatically compile</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// source as necessary when looking for class files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">Class</span> loadClass<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> name, <span class="kw4">boolean</span> resolve <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AClassNotFoundException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ClassNotFoundException</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Our goal is to get a Class object</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">Class</span> clas = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// First, see if we&#8217;ve already dealt with this one</span></div>
</li>
<li class="li1">
<div class="de1">clas = findLoadedClass<span class="br0">&#40;</span> name <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//System.out.println( &quot;findLoadedClass: &quot;+clas );</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Create a pathname from the class name</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// E.g. java.lang.Object =&gt; java/lang/Object</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> fileStub = name.<span class="me1">replace</span><span class="br0">&#40;</span> <span class="st0">&#8216;.&#8217;</span>, <span class="st0">&#8216;/&#8217;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Build objects pointing to the source code (.java) and object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// code (.class)</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> javaFilename = fileStub+<span class="st0">&quot;.java&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> classFilename = fileStub+<span class="st0">&quot;.class&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a> javaFile = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a><span class="br0">&#40;</span> javaFilename <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a> classFile = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">File</span></a><span class="br0">&#40;</span> classFilename <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//System.out.println( &quot;j &quot;+javaFile.lastModified()+&quot; c &quot;+</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// &nbsp;classFile.lastModified() );</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// First, see if we want to try compiling. &nbsp;We do if (a) there</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// is source code, and either (b0) there is no object code,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// or (b1) there is object code, but it&#8217;s older than the source</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>javaFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;amp;&amp;amp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>!classFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ||</div>
</li>
<li class="li1">
<div class="de1">javaFile.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; classFile.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Try to compile it. &nbsp;If this doesn&#8217;t work, then</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// we must declare failure. &nbsp;(It&#8217;s not good enough to use</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// and already-existing, but out-of-date, classfile)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>!compile<span class="br0">&#40;</span> javaFilename <span class="br0">&#41;</span> || !classFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">throw</span> <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AClassNotFoundException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ClassNotFoundException</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Compile failed: &quot;</span>+javaFilename <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw2">catch</span><span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> ie <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Another place where we might come to if we fail</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// to compile</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">throw</span> <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AClassNotFoundException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ClassNotFoundException</span></a><span class="br0">&#40;</span> ie.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Let&#8217;s try to load up the raw bytes, assuming they were</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// properly compiled, or didn&#8217;t need to be compiled</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// read the bytes</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">byte</span> raw<span class="br0">&#91;</span><span class="br0">&#93;</span> = getBytes<span class="br0">&#40;</span> classFilename <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// try to turn them into a class</span></div>
</li>
<li class="li1">
<div class="de1">clas = defineClass<span class="br0">&#40;</span> name, raw, <span class="nu0">0</span>, raw.<span class="me1">length</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw2">catch</span><span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">IOException</span></a> ie <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// This is not a failure! &nbsp;If we reach here, it might</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// mean that we are dealing with a class in a library,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// such as java.lang.Object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//System.out.println( &quot;defineClass: &quot;+clas );</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Maybe the class is in a library &#8212; try loading</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// the normal way</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>clas==<span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">clas = findSystemClass<span class="br0">&#40;</span> name <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//System.out.println( &quot;findSystemClass: &quot;+clas );</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Resolve the class, if any, but only if the &quot;resolve&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// flag is set to true</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>resolve &amp;amp;&amp;amp; clas != <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">resolveClass<span class="br0">&#40;</span> clas <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// If we still don&#8217;t have a class, it&#8217;s an error</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span>clas == <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">throw</span> <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AClassNotFoundException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ClassNotFoundException</span></a><span class="br0">&#40;</span> name <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Otherwise, return the class</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> clas;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>CCRun.java</p>
<p>以下是 CCRun.java 的源代码</p>
<p>// $Id$</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.lang.reflect.*;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">CCLRun executes a Java program by loading it through a</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">CompilingClassLoader.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> CCLRun</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">static</span> <span class="kw2">public</span> <span class="kw4">void</span> main<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> args<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// The first argument is the Java program (class) the user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// wants to run</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> progClass = args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// And the arguments to that program are just</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// arguments 1..n, so separate those out into</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// their own array</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> progArgs<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span>args.<span class="me1">length</span><span class="nu0">-1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">arraycopy</span><span class="br0">&#40;</span> args, <span class="nu0">1</span>, progArgs, <span class="nu0">0</span>, progArgs.<span class="me1">length</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Create a CompilingClassLoader</span></div>
</li>
<li class="li1">
<div class="de1">CompilingClassLoader ccl = <span class="kw2">new</span> CompilingClassLoader<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Load the main class through our CCL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">Class</span> clas = ccl.<span class="me1">loadClass</span><span class="br0">&#40;</span> progClass <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Use reflection to call its main() method, and to</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// pass the arguments in.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Get a class representing the type of the main method&#8217;s argument</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">Class</span> mainArgType<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#123;</span> <span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Find the standard main method in the class</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Method</span></a> main = clas.<span class="me1">getMethod</span><span class="br0">&#40;</span> <span class="st0">&quot;main&quot;</span>, mainArgType <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Create a list containing the arguments &#8212; in this case,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// an array of strings</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> argsArray<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#123;</span> progArgs <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Call the method</span></div>
</li>
<li class="li2">
<div class="de2">main.<span class="me1">invoke</span><span class="br0">&#40;</span> <span class="kw2">null</span>, argsArray <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Foo.java</p>
<p>以下是 Foo.java 的源代码</p>
<p>// $Id$</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Foo</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">static</span> <span class="kw2">public</span> <span class="kw4">void</span> main<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> args<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="kw2">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> <span class="st0">&quot;foo! &quot;</span>+args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>+<span class="st0">&quot; &quot;</span>+args<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> Bar<span class="br0">&#40;</span> args<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, args<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Bar.java</p>
<p>以下是 Bar.java 的源代码</p>
<p>// $Id$</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import baz.*;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Bar</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Bar<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> a, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> b <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> <span class="st0">&quot;bar! &quot;</span>+a+<span class="st0">&quot; &quot;</span>+b <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> Baz<span class="br0">&#40;</span> a, b <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">Class</span> booClass = <span class="kw2">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span> <span class="st0">&quot;Boo&quot;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> boo = booClass.<span class="me1">newInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw2">catch</span><span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>baz/Baz.java</p>
<p>以下是 baz/Baz.java 的源代码</p>
<p>// $Id$</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> baz;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Baz</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Baz<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> a, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> b <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> <span class="st0">&quot;baz! &quot;</span>+a+<span class="st0">&quot; &quot;</span>+b <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Boo.java</p>
<p>以下是 Boo.java 的源代码</p>
<p>// $Id$</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Boo</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Boo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span> <span class="st0">&quot;Boo!&quot;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/712/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java数组实现循环队列</title>
		<link>http://www.javagg.com/archives/696</link>
		<comments>http://www.javagg.com/archives/696#comments</comments>
		<pubDate>Mon, 29 Mar 2010 03:25:07 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Queue]]></category>
		<category><![CDATA[数组]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=696</guid>
		<description><![CDATA[Java数组实现循环队列，队尾指针为rear，队首指针为front，队尾入队，队首出队，数组空间循环利用。
view plaincopy to clipboardprint?/**&#160; &#160;* QueueArray.java&#160; &#160;*/&#160; package cn.edu.uibe.oop;&#160;&#160; /**&#160; &#160;* 数组实现的循环队列&#160; &#160;* @author TongQiang&#160; &#160;*/&#160; public class QueueArray {&#160;&#160; &#160;&#160;&#160; Object[] a; //对象数组，队列最多存储a.length-1个对象&#160;&#160; &#160;&#160;&#160; int front;&#160; //队首下标&#160;&#160; &#160;&#160;&#160; int rear;&#160;&#160; //队尾下标&#160;&#160; &#160;&#160;&#160; public QueueArray(){&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; this(10); //调用其它构造方法&#160;&#160; &#160;&#160;&#160; }&#160;&#160; &#160;&#160;&#160; public QueueArray(int size){&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; a = new Object[size];&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; front = 0;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; rear [...]]]></description>
			<content:encoded><![CDATA[<p><FONT face=Arial>Java数组实现循环队列，队尾指针为rear，队首指针为front，队尾入队，队首出队，数组空间循环利用。</FONT></P><br />
<P><FONT face=Arial>view plaincopy to clipboardprint?<BR>/**&nbsp; <BR>&nbsp;* QueueArray.java&nbsp; <BR>&nbsp;*/&nbsp; <BR>package cn.edu.uibe.oop;&nbsp;&nbsp; <BR>/**&nbsp; <BR>&nbsp;* 数组实现的循环队列&nbsp; <BR>&nbsp;* @author TongQiang&nbsp; <BR>&nbsp;*/&nbsp; <BR>public class QueueArray {&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Object[] a; //对象数组，队列最多存储a.length-1个对象&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; int front;&nbsp; //队首下标&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; int rear;&nbsp;&nbsp; //队尾下标&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public QueueArray(){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this(10); //调用其它构造方法&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public QueueArray(int size){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = new Object[size];&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; front = 0;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rear =0;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; /**&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; * 将一个对象追加到队列尾部&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param obj 对象&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return 队列满时返回false,否则返回true&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp; <BR>&nbsp;&nbsp;&nbsp; public boolean enqueue(Object obj){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((rear+1)%a.length==front){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[rear]=obj;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rear = (rear+1)%a.length;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; /**&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; * 队列头部的第一个对象出队&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return 出队的对象，队列空时返回null&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp; <BR>&nbsp;&nbsp;&nbsp; public Object dequeue(){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rear==front){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj = a[front];&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; front = (front+1)%a.length;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueArray q = new QueueArray(4);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(q.enqueue(&#8220;张三&#8221;));&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(q.enqueue(&#8220;李斯&#8221;));&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(q.enqueue(&#8220;赵五&#8221;));&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(q.enqueue(&#8220;王一&#8221;));//无法入队列，队列满&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;4;i++){&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(q.dequeue());&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>}&nbsp; </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/696/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java如何获得文件编码格式</title>
		<link>http://www.javagg.com/archives/692</link>
		<comments>http://www.javagg.com/archives/692#comments</comments>
		<pubDate>Fri, 26 Mar 2010 08:24:45 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=692</guid>
		<description><![CDATA[在程序中，文本文件经常用来存储标准的ASCII码文本，比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符，如基于GBK的简体中文，基于BIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式；而在读取这些文本文件时，有时候就需要自动判定文件的编码格式。
按照给定的字符集存储文本文件时，在文件的最开头的三个字节中就有可能存储着编码信息，所以，基本的原理就是只要读出文件前三个字节，判定这些字节的值，就可以得知其编码的格式。其实，如果项目运行的平台就是中文操作系统，如果这些文本文件在项目内产生，即开发人员可以控制文本的编码格式，只要判定两种常见的编码就可以了：GBK和UTF-8。由于中文Windows默认的编码是GBK，所以一般只要判定UTF-8编码格式。
对于UTF-8编码格式的文本文件，其前3个字节的值就是-17、-69、-65，所以，判定是否是UTF-8编码格式的代码片段如下：
测试文件编码是否为UTF-8
       File file = new File(path);
       InputStream ios = new java.io.FileInputStream(file);
       byte[] b = new byte[3];
       ios.read(b);
       ios.close();
       if (b[0] == -17 &#38;&#38; b[1] == -69 &#38;&#38; b[2] == -65)
           System.out.println(file.getName() + &#8220;：编码为UTF-8&#8243;);
       else
           System.out.println(file.getName() + &#8220;：可能是GBK，也可能是其他编码。&#8221;);
上述代码只是简单判定了是否是UTF-8格式编码的文本文件，如果项目对要判定的文本文件编码不可控（比如用户上传的一些HTML、XML等文本），可以采用一个现成的开源项目：cpdetector，它所在的网址是：http://www.oschina.net/p/cpdetector。它的类库很小，只有500K左右，利用该类库判定文本文件的代码如下：

FileEncodeDetector

package cn.edu.cqu.tiger;

import info.monitorenter.cpdetector.io.ASCIIDetector;

import info.monitorenter.cpdetector.io.CodepageDetectorProxy;

import info.monitorenter.cpdetector.io.JChardetFacade;

import info.monitorenter.cpdetector.io.ParsingDetector;

import info.monitorenter.cpdetector.io.UnicodeDetector;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

public class FileEncodeDetector {

    public static [...]]]></description>
			<content:encoded><![CDATA[<div>在程序中，文本文件经常用来存储标准的ASCII码文本，比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符，如基于GBK的简体中文，基于BIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式；而在读取这些文本文件时，有时候就需要自动判定文件的编码格式。<span id="more-692"></span></p>
<p>按照给定的字符集存储文本文件时，在文件的最开头的三个字节中就有可能存储着编码信息，所以，基本的原理就是只要读出文件前三个字节，判定这些字节的值，就可以得知其编码的格式。其实，如果项目运行的平台就是中文操作系统，如果这些文本文件在项目内产生，即开发人员可以控制文本的编码格式，只要判定两种常见的编码就可以了：GBK和UTF-8。由于中文Windows默认的编码是GBK，所以一般只要判定UTF-8编码格式。</p>
<p>对于UTF-8编码格式的文本文件，其前3个字节的值就是-17、-69、-65，所以，判定是否是UTF-8编码格式的代码片段如下：</p>
<p>测试文件编码是否为UTF-8</p>
<p>       File file = new File(path);</p>
<p>       InputStream ios = new java.io.FileInputStream(file);</p>
<p>       byte[] b = new byte[3];</p>
<p>       ios.read(b);</p>
<p>       ios.close();</p>
<p>       if (b[0] == -17 &amp;&amp; b[1] == -69 &amp;&amp; b[2] == -65)</p>
<p>           System.out.println(file.getName() + &#8220;：编码为UTF-8&#8243;);</p>
<p>       else</p>
<p>           System.out.println(file.getName() + &#8220;：可能是GBK，也可能是其他编码。&#8221;);</p>
<p>上述代码只是简单判定了是否是UTF-8格式编码的文本文件，如果项目对要判定的文本文件编码不可控（比如用户上传的一些HTML、XML等文本），可以采用一个现成的开源项目：cpdetector，它所在的网址是：http://www.oschina.net/p/cpdetector。它的类库很小，只有500K左右，利用该类库判定文本文件的代码如下：</p>
<pre code="java">
FileEncodeDetector

package cn.edu.cqu.tiger;

import info.monitorenter.cpdetector.io.ASCIIDetector;

import info.monitorenter.cpdetector.io.CodepageDetectorProxy;

import info.monitorenter.cpdetector.io.JChardetFacade;

import info.monitorenter.cpdetector.io.ParsingDetector;

import info.monitorenter.cpdetector.io.UnicodeDetector;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

public class FileEncodeDetector {

    public static String getFileEncode(String path) {

       /*------------------------------------------------------------------------

         detector是探测器，它把探测任务交给具体的探测实现类的实例完成。

         cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法

         加进来，如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。  

         detector按照“谁最先返回非空的探测结果，就以该结果为准”的原则返回探测到的

         字符集编码。

          使用需要用到三个第三方JAR包：antlr.jar、chardet.jar和cpdetector.jar

          cpDetector是基于统计学原理的，不保证完全正确。

       --------------------------------------------------------------------------*/

       CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

       /*-------------------------------------------------------------------------

         ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于

         指示是否显示探测过程的详细信息，为false不显示。

       ---------------------------------------------------------------------------*/

       detector.add(new ParsingDetector(false));

       /*--------------------------------------------------------------------------

         JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码

         测定。所以，一般有了这个探测器就可满足大多数项目的要求，如果你还不放心，可以

         再多加几个探测器，比如下面的ASCIIDetector、UnicodeDetector等。

        ---------------------------------------------------------------------------*/

       detector.add(JChardetFacade.getInstance());//用到antlr.jar、chardet.jar

       // ASCIIDetector用于ASCII编码测定

       detector.add(ASCIIDetector.getInstance());

       // UnicodeDetector用于Unicode家族编码的测定

       detector.add(UnicodeDetector.getInstance());

       java.nio.charset.Charset charset = null;

       File f = new File(path);

       try {

           charset = detector.detectCodepage(f.toURI().toURL());

       } catch (Exception ex) {

           ex.printStackTrace();

       }

       if (charset != null)

           return charset.name();

       else

           return null;

    }

    public static void main(String[] args) throws IOException,

           FileNotFoundException {

       String path = "J:\\Unicode\\ub.txt";

       //Windows下Unicode探测后得到Windows-1252

       String encode = getFileEncode(path);

       if("Windows-1252".equalsIgnoreCase(encode))

           encode = "Unicode";

       File file = new File(path);

       InputStream ios = new java.io.FileInputStream(file);

       byte[] b = new byte[3];

       ios.read(b);

       ios.close();

       if (b[0] == -17 &amp;&amp; b[1] == -69 &amp;&amp; b[2] == -65)//文件头

           System.out.println(file.getName() + "：编码为UTF-8");

       else

           System.out.println(file.getName() + "：可能是GBK，也可能是其他编码。");

       BufferedReader bufferedReader = new BufferedReader(

              new InputStreamReader(new FileInputStream(file), encode));

       System.out.println(encode);

       System.out.println(bufferedReader.readLine().substring(1));//去掉第一行中的文件头

    }

}
</pre>
<p>       上面代码中的detector不仅可以用于探测文件的编码，也可以探测任意输入的文本流的编码，方法是调用其重载形式：</p>
<p>charset=detector.detectCodepage(InputStream in, int length);</p>
<p>       上面的字节数由程序员指定，字节数越多，判定越准确，当然时间也花得越长。要注意，字节数的指定不能超过文本流的最大长度。</p>
<p>判定文件编码的具体应用举例：</p>
<p>属性文件(.properties)是Java程序中的常用文本存储方式，象STRUTS框架就是利用属性文件存储程序中的字符串资源。它的内容如下所示：</p>
<p>#注释语句  </p>
<p>属性名=属性值</p>
<p>       读入属性文件的一般方法是：</p>
<p>  FileInputStream ios=new FileInputStream(&#8220;属性文件名&#8221;);</p>
<p>  Properties prop=new Properties();</p>
<p>  prop.load(ios);</p>
<p>  ios.close();</p>
<p>       利用java.io.Properties的load方法读入属性文件虽然方便，但如果属性文件中有中文，在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本，在读入后需要将字节流编码成为字符串，而它使用的编码是“iso-8859-1”,这个字符集是ASCII码字符集，不支持中文编码，所以这时需要使用显式的转码：</p>
<p>   String value=prop.getProperty(&#8220;属性名&#8221;);</p>
<p>   String encValue=new String(value.getBytes(&#8220;iso-8859-1&#8243;),&#8221;属性文件的实际编码&#8221;);</p>
<p>       在上面的代码中，属性文件的实际编码就可以利用上面的方法获得。当然，象这种属性文件是项目内部的，我们可以控制属性文件的编码格式，比如约定采用Windows内定的GBK，就直接利用&#8221;gbk&#8221;来转码，如果约定采用UTF-8，也可以是使用&#8221;UTF-8&#8243;直接转码。如果想灵活一些，做到自动探测编码，就可利用上面介绍的方法测定属性文件的编码，从而方便开发人员的工作。</p>
<p>可以用下面代码获得Java支持编码集合：</p>
<p>Charset.availableCharsets().keySet();</p>
<p>       可以用下面的代码获得系统默认编码：</p>
<p>Charset.defaultCharset();</p></div>
<p><script type="text/javascript">// <![CDATA[
google_ad_client = "pub-4348265167276910";
/* 468x60, 个人博客 */
google_ad_slot = "2046406163";
google_ad_width = 468;
google_ad_height = 60;
// ]]&gt;</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script type="text/javascript">// <![CDATA[
google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/692/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(5)</title>
		<link>http://www.javagg.com/archives/684</link>
		<comments>http://www.javagg.com/archives/684#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:55:50 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=684</guid>
		<description><![CDATA[1)columnFamily下一个column和多个column的读取区别
2)columnfamily 和superColumnFamily的读取区别
测试机数量：两台，jvm最大使用内存都开到1.3G。
起始key: 1356278962 ;
改变组：
product_name1    :    &#8220;是一个非常可靠的大规模分布式存储系统&#8221;
product_name2    :    &#8220;中国惨败伊朗丢亚锦赛冠军创34年参赛最耻辱一败&#8221;
控制组：
product_value1    :    &#8220;第一次在主场丢冠军&#8221;
product_value2    :    &#8220;胡雪峰顶替受伤的刘炜&#8221;
product_value3    :    &#8220;朱芳雨都有外线出手机会&#8221;
product_value4    :    &#8220;张庆鹏传球意图太过明显&#8221;
product_value5    :    &#8220;最后一节比赛&#8221;
product_value6    :    &#8220;中国队首发：易建联、王治郅、朱芳雨、王仕鹏、胡雪峰&#8221;
product_value7    :    &#8220;中国队本次亚锦赛首次尝到失利的滋味，在家门口把冠军拱手相让&#8221;
product_value8    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体&#8221;
//下面这个是一个要存入的“摘要”
product_value9    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体，
            单打独斗的进攻模式成功率相当低。伊朗队内外结合，多点得分，
            继续扩大分差。朱芳雨传球被断，对手长传快攻，14号球员扣篮得分，
            28-53。王治郅强攻得手，造成哈达迪犯规，加罚命中。
            王治郅再次溜到篮下，反身投篮得分。王治郅成为中国队的唯一亮点，
            持球接连晃过三名球员的防守，投篮得分，加罚再中，
            36-53。靠着王治郅的出色发挥，中国队留住翻盘的一线希望。
            第三节结束，39-56，分差仍为17分。&#8221;
   
我们有的ColumnFamily: Standard1 Standard2 Super1 Super2
测试1：    向Standard1中写入10万条记录，此时Standard1中只有&#8221;product_name&#8221;一个column,key是从1356278962开始往后10万个
    insert()进行插入，速度很慢，不可能在一小时内完成
    CQL 用时256秒,关掉log后用时55秒
测试2：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次
    CQL：
    当config中的ReplicationFactor为1的时候，用时120秒
    当config中的ReplicationFactor为2的时候，用时183秒；关掉log后用时42秒
   
测试3：    将存在的各个key的product_name读取一遍（此时相应columnFamily中只有1个column）
    当config中的ReplicationFactor为1的时候：速度相当慢
    当config中的ReplicationFactor为2的时候：
        CQL：
        用时267秒；关掉log后用时145秒
        API：
        用get_column用时203秒；关掉log后用时135秒
以下均以ReplicationFactor=2来进行测试
测试4：    依照已经存在的各个key，向Standard1中写入10万条控制组里面的column数据
    [...]]]></description>
			<content:encoded><![CDATA[<p>1)columnFamily下一个column和多个column的读取区别<br />
2)columnfamily 和superColumnFamily的读取区别</p>
<p>测试机数量：两台，jvm最大使用内存都开到1.3G。</p>
<p>起始key: 1356278962 ;</p>
<p>改变组：<br />
product_name1    :    &#8220;是一个非常可靠的大规模分布式存储系统&#8221;<br />
product_name2    :    &#8220;中国惨败伊朗丢亚锦赛冠军创34年参赛最耻辱一败&#8221;<span id="more-684"></span></p>
<p>控制组：<br />
product_value1    :    &#8220;第一次在主场丢冠军&#8221;<br />
product_value2    :    &#8220;胡雪峰顶替受伤的刘炜&#8221;<br />
product_value3    :    &#8220;朱芳雨都有外线出手机会&#8221;<br />
product_value4    :    &#8220;张庆鹏传球意图太过明显&#8221;<br />
product_value5    :    &#8220;最后一节比赛&#8221;<br />
product_value6    :    &#8220;中国队首发：易建联、王治郅、朱芳雨、王仕鹏、胡雪峰&#8221;<br />
product_value7    :    &#8220;中国队本次亚锦赛首次尝到失利的滋味，在家门口把冠军拱手相让&#8221;<br />
product_value8    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体&#8221;</p>
<p>//下面这个是一个要存入的“摘要”<br />
product_value9    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体，<br />
            单打独斗的进攻模式成功率相当低。伊朗队内外结合，多点得分，<br />
            继续扩大分差。朱芳雨传球被断，对手长传快攻，14号球员扣篮得分，<br />
            28-53。王治郅强攻得手，造成哈达迪犯规，加罚命中。<br />
            王治郅再次溜到篮下，反身投篮得分。王治郅成为中国队的唯一亮点，<br />
            持球接连晃过三名球员的防守，投篮得分，加罚再中，<br />
            36-53。靠着王治郅的出色发挥，中国队留住翻盘的一线希望。<br />
            第三节结束，39-56，分差仍为17分。&#8221;</p>
<p>   <br />
我们有的ColumnFamily: Standard1 Standard2 Super1 Super2</p>
<p>测试1：    向Standard1中写入10万条记录，此时Standard1中只有&#8221;product_name&#8221;一个column,key是从1356278962开始往后10万个</p>
<p>    insert()进行插入，速度很慢，不可能在一小时内完成<br />
    CQL 用时256秒,关掉log后用时55秒</p>
<p>测试2：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次<br />
    CQL：</p>
<p>    当config中的ReplicationFactor为1的时候，用时120秒<br />
    当config中的ReplicationFactor为2的时候，用时183秒；关掉log后用时42秒</p>
<p>   <br />
测试3：    将存在的各个key的product_name读取一遍（此时相应columnFamily中只有1个column）<br />
    当config中的ReplicationFactor为1的时候：速度相当慢<br />
    当config中的ReplicationFactor为2的时候：</p>
<p>        CQL：</p>
<p>        用时267秒；关掉log后用时145秒</p>
<p>        API：<br />
        用get_column用时203秒；关掉log后用时135秒</p>
<p>以下均以ReplicationFactor=2来进行测试</p>
<p>测试4：    依照已经存在的各个key，向Standard1中写入10万条控制组里面的column数据<br />
    API：</p>
<p>    batch_insert() 速度非常慢</p>
<p>    CQL：<br />
    90万个column元素,其中包括一个类似摘要大小的字符串(200字左右)，用时2004秒；关掉log后用时512秒。</p>
<p>测试5：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次</p>
<p>    API：<br />
    使用insert()速度相当慢</p>
<p>    CQL：<br />
    用时190秒；关掉log后用时45秒</p>
<p>测试6：    将存在的各个key的product_name读取一遍（此时相应columnFamily中已经有10个column了）</p>
<p>    API：</p>
<p>    使用get_column()用时757秒;关掉log后用时188秒</p>
<p>    CQL：</p>
<p>    用时更慢一些，用时861秒;关掉log后用时202秒</p>
<p>super测试1：在Super1中创建superColumn1，在superColumn1中只创建1个column-&#8221;product_name&#8221;,然后写入10万条数据,key是从1356278962开始往后10万个</p>
<p>    CQL：</p>
<p>    用时316秒;关掉log后用时60秒<br />
super测试2：然后在product_name1 和 product_name2之间反复修改superColumn1下key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次<br />
    CQL：</p>
<p>    用时195秒;关掉log后用时62秒<br />
super测试3：将存在的各个key的product_name读取一遍（此时相应superColumnFamily中只有1个column）</p>
<p>    API：</p>
<p>    get_column() 用时235秒;关掉log后用时234秒</p>
<p>    CQL：</p>
<p>    用时356秒 ;关掉log后用时158秒</p>
<p>super测试4：依照已经存在的各个key,依次向superColumn1中写入10万条控制组里面的column数据</p>
<p>    CQL：</p>
<p>    用时2058秒;关掉log后，竟然非常慢，不知道为什么，但是重新启动下节点后，速度变快，用时562秒<br />
super测试4：然后在product_name1 和 product_name2之间反复修改superColumn1下key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次</p>
<p>   CQL：</p>
<p>   用时190秒,关掉log后用时48秒<br />
super测试6：将存在的各个key的product_name读取一遍（此时相应superColumnFamily中已经有10个column了）</p>
<p>    API：</p>
<p>    用get_column 用时 356秒;关掉log后用时191秒</p>
<p>    CQL：</p>
<p>    用时314秒;关掉log后用时208秒</p>
<p>结论：使用superColumn的开销不比column大很多，向columnFamily中加入更多的column对读取速度的影响不大。相比而言受log和ReplicationFactor的影响更大。另外在写入的时候CQL的效率更高，在读取的时候get_column更好一些。而API中的其他方法如batch_insert()，insert()效率明显不高。但这只是两个节点的情况，当有更多节点的时候情况可能又会不一样了。</p>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/17/4456357.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/17/4456357.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/684/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(4)</title>
		<link>http://www.javagg.com/archives/682</link>
		<comments>http://www.javagg.com/archives/682#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:55:10 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=682</guid>
		<description><![CDATA[(一)依赖:cassandra.jar
             libthrift.jar
(二)连接:
    //该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API



&#160;


     public Cassandra.Client getClient&#40;&#41;


    &#123;


        //192.168.0.169为想连接到的某个节点的ip,9160为端口&#60;span id=&#34;more-682&#34;&#62;&#60;/span&#62;


&#160;


        TSocket socket = new TSocket&#40;&#34;192.168.0.169&#34;, 9160&#41;;


&#160;


        TTransport transport_ = socket;


&#160;


        TBinaryProtocol binaryProtocol = new TBinaryProtocol&#40;transport_, false, false&#41;;


        Cassandra.Client cassandraClient = new Cassandra.Client&#40;binaryProtocol&#41;;


&#160;


        try


        &#123;


            transport_.open&#40;&#41;;


        &#125;


        catch&#40;Exception e&#41;


        &#123;


            // Should move this to Log4J as well probably&#8230;


            System.err.println&#40;&#34;Exception &#34; + e.getMessage&#40;&#41;&#41;;          


            e.printStackTrace&#40;&#41;;


        &#125;


      


        return cassandraClient;


     


    [...]]]></description>
			<content:encoded><![CDATA[<p>(一)依赖:cassandra.jar</p>
<p>             libthrift.jar</p>
<p>(二)连接:</p>
<p>    //该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">     <span class="kw2">public</span> Cassandra.<span class="me1">Client</span> getClient<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//192.168.0.169为想连接到的某个节点的ip,9160为端口&lt;span id=&quot;more-682&quot;&gt;&lt;/span&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        TSocket socket = <span class="kw2">new</span> TSocket<span class="br0">&#40;</span><span class="st0">&quot;192.168.0.169&quot;</span>, <span class="nu0">9160</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        TTransport transport_ = socket;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        TBinaryProtocol binaryProtocol = <span class="kw2">new</span> TBinaryProtocol<span class="br0">&#40;</span>transport_, <span class="kw2">false</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        Cassandra.<span class="me1">Client</span> cassandraClient = <span class="kw2">new</span> Cassandra.<span class="me1">Client</span><span class="br0">&#40;</span>binaryProtocol<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            transport_.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">// Should move this to Log4J as well probably&#8230;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Exception &quot;</span> + e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;          </div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">      </div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">return</span> cassandraClient;</div>
</li>
<li class="li2">
<div class="de2">     </div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>(三)API</p>
<p>1)该方法向key的指定path插入一个数据，另外想要对key某指定path的数据进行修改也使用这个方法</p>
<p>   代码中的cli是一个Cassandra.Client实例</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">     <span class="kw2">public</span> <span class="kw4">void</span> test_insert<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key = <span class="st0">&quot;testkey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;testColumn&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;testValue&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//对数据进行定位</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//向cassandra中插入一条数据</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName,key,path,value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>2)该方法试用Cql语句的方式发送请求，有一个问题就是当请求的参数或不正确的时候，方法不会报错，只是返回为空；</p>
<p>   但是在语法出现错误的时候还是会有InvalidRequestException抛出,提示Unresolved compilation problems</p>
<p>   代码中的cli是一个Cassandra.Client实例</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">   <span class="kw2">public</span> <span class="kw4">void</span> test_excuteQuery<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            cli.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="st0">&quot;set Table1.Standard1['testKey2']['testColumn']=&#8217;testValue2&#8242;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            CqlResult_t crt = cli.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="st0">&quot;get Table1.Standard1['testKey2']&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            List&lt;Map&lt;String, String&gt;&gt; rs = crt.<span class="me1">getResultSet</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//遍历显示所有column_t中的内容</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span>rs != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span> ; i &lt; rs.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ; i++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                    Map&lt;String , String&gt; map = rs.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                    <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key : map.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>key+<span class="st0">&quot; : &quot;</span>+map.<span class="me1">get</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">                <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;result set is null&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>3)根据path信息获取一个column</p>
<p>   path是一个定位信息，standard column family是两层 super column family是三层</p>
<p>   superColumnFamily:superColumn:standardColumn。</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">   <span class="kw2">public</span> <span class="kw4">void</span> test_get_column<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> column = <span class="st0">&quot;testColumn&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+column;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, key, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getColumnName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span>cmt.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getTimestamp</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">          </div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>4)</p>
<p>    //术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice</p>
<p>    //给定table,key和columnFamily的信息，<br />
    //此方法将返回，该key在当前columnFamily的slice中有都少个column元素<br />
    //该例子中key:&#8221;testKey2&#8243;在columnFamily:&#8221;Standard1&#8243;中的slice有几个column元素</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_column_count<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">get_column_count</span><span class="br0">&#40;</span>tableName, keyName, columnFamily<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>5) //暂不确定</p>
<p>    //根据给定的时间点，取出以后的对应给定key的一组columns<br />
    //但是好像在时间上有延迟,这个不确定</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_columns_since<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ALong+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Long</span></a> sinceTime = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="nu0">-5000</span>*<span class="nu0">1000</span>;<span class="co1">//取当前时间之前120秒以内的</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_columns_since</span><span class="br0">&#40;</span>tableName , keyName , columnFamily , sinceTime<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;cmts size : &quot;</span>+cmts.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>6)//range queries may only be performed against an order-preserving partitioner<br />
    //如果系统试用的节点定位的RandomPartitioner的话那么这个方法将不能试用，好处是跟均衡的存储</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//此方法尚在研究中</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_key_range<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">get_key_range</span><span class="br0">&#40;</span><span class="st0">&quot;Table1&quot;</span>, <span class="st0">&quot;？？&quot;</span>, <span class="st0">&quot;？？&quot;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">          </div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>7) //术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//每一个columnFamily都存在一个排序,或按照name或按照time</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//该方法将取出对应某个key的一定区间段内的column元素</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;    <span class="co1">//想要从哪个columnFamily中获取column</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> start = <span class="nu0">0</span>;<span class="co1">//起始位置</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw4">int</span> count = <span class="nu0">10</span>;<span class="co1">//获取数量</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_slice</span><span class="br0">&#40;</span>tableName, keyName, columnFamily, start, count<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;cmts size : &quot;</span>+cmts.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> <img src='http://www.javagg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> //通过一个column的名字数组来查找相对应的属于给定key的slice（一组column 元素）</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice_by_names<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        List&lt;String&gt; columnNameList = <span class="kw2">new</span> ArrayList&lt;String&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        columnNameList.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;testColumn&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_slice_by_names</span><span class="br0">&#40;</span>tableName, keyName, columnFamily, columnNameList<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>9)//描述一个table中的各个columnFamily的基本信息</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_describe_table<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">describeTable</span><span class="br0">&#40;</span><span class="st0">&quot;Table1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>10)//批量的针对一个key插入数据</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_batch_insert<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testkey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当下的Map保存了ColumnFamily到他内部的column元素列表的一个映射</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//所以String 应该保存 对应columnFamily的名字。</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//column_t(column元素)包含：columnName , value , timestamp 三要素</span></div>
</li>
<li class="li2">
<div class="de2">            Map&lt;String , List&lt;column_t&gt;&gt; CFmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;column_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作两个column_t实例</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt1 = <span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;test_column_name_1&quot;</span> , <span class="st0">&quot;test_column_value_1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span> , <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            column_t cmt2 = <span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;test_column_name_2&quot;</span> , <span class="st0">&quot;test_column_value_2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span> , <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作一个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; cList = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cList.<span class="me1">add</span><span class="br0">&#40;</span>cmt1<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cList.<span class="me1">add</span><span class="br0">&#40;</span>cmt2<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作一个将其写入CFmap中</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamilyName = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">            CFmap.<span class="me1">put</span><span class="br0">&#40;</span>columnFamilyName, cList<span class="br0">&#41;</span>;<span class="co1">//这样在以后的插入操作中，相应的column_t将插入&quot;Docin&quot;这个family中</span></div>
</li>
<li class="li1">
<div class="de1">            batch_mutation_t bmt = <span class="kw2">new</span> batch_mutation_t<span class="br0">&#40;</span>tableName , keyName , CFmap<span class="br0">&#41;</span>;<span class="co1">//完成插入的key的定位</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个针对相应key和colmunFamily的batch_insert</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert</span><span class="br0">&#40;</span>bmt, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">           </div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>11)//同insert()相对的反向操作<br />
    //当我们试图查询一个不存在的column_t元素的时候，会有&#8221;NotFoundException&#8221;异常被抛出</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_remove<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;removetest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;removetestkey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;removetestvalue&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//先将相应的column元素写入</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName, keyName, path, value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//尝试读出信息</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            displayColumn<span class="br0">&#40;</span>cmt<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//删除这条信息</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">remove</span><span class="br0">&#40;</span>tableName, keyName, path, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//尝试读出信息</span></div>
</li>
<li class="li1">
<div class="de1">        column_t cmt2;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cmt2 = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            displayColumn<span class="br0">&#40;</span>cmt2<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;NotFoundException 异常抛出，column_元素已经被删除&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>12)//插入一个superColumn元素<br />
    //不含有内容的superColumn不能同过该方法被创建,会抛出异常</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_batch_insert_super_t<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName    = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName        = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamilyName = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生1个superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//首先产生1个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; Clist = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当两个名字一样的时候，先前的会被覆盖</span></div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper1&quot;</span>,<span class="st0">&quot;stardcolumn1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper2&quot;</span>,<span class="st0">&quot;stardcolumn2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生一个superColumn元素</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            superColumn_t sct = <span class="kw2">new</span> superColumn_t<span class="br0">&#40;</span>superColumnName , Clist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将这个元素装入到一个superColumn_t的List中</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; SClist = <span class="kw2">new</span> ArrayList&lt;superColumn_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            SClist.<span class="me1">add</span><span class="br0">&#40;</span>sct<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中</span></div>
</li>
<li class="li1">
<div class="de1">            Map&lt;String , List&lt;superColumn_t&gt;&gt; cfmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;superColumn_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cfmap.<span class="me1">put</span><span class="br0">&#40;</span>superColumnFamilyName, SClist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//区别于一般的，这里要求的column元素是superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将整理好的信息关联一个key后生成一个mutation</span></div>
</li>
<li class="li2">
<div class="de2">            batch_mutation_super_t bmst = <span class="kw2">new</span> batch_mutation_super_t<span class="br0">&#40;</span>tableName,keyName,cfmap<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw4">boolean</span> block = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个mutation的插入操作</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert_superColumn</span><span class="br0">&#40;</span>bmst, block<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>13)//获取一个SuperColumn中的信息</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_superColumn<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamilyName = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamilyName+<span class="st0">&quot;:&quot;</span>+superColumnName;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            superColumn_t sct = cli.<span class="me1">get_superColumn</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span>sct != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Super Name : &quot;</span>+sct.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Size : &quot;</span>+sct.<span class="me1">getColumnsSize</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                List&lt;column_t&gt; clist = sct.<span class="me1">getColumns</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;super column is empty&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>14)//尝试向一个superColumn中添加column元素(就是column_t对象)<br />
   //注意：想superColumnFamily中添加一般的column元素是不被允许的,所以superColumnFamliy中只能有superColumn，而superColumn中只能有一般的column<br />
   //而一般的columnFamily中也只能有一般的column</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_insert_standard_to_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;normal_column&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;normal_column_value_add&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamily+<span class="st0">&quot;:&quot;</span>+superColumnName+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName, keyName, path, value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//尝试取出这个元素并显示这个元素</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="kw1">if</span><span class="br0">&#40;</span>cmt != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column name : &quot;</span>+cmt.<span class="me1">getColumnName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column value: &quot;</span>+<span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span>cmt.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column time : &quot;</span>+cmt.<span class="me1">getTimestamp</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column is empty&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>15)//术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 或superColumnFamily分成了很多slice<br />
    //同针对一般的columnFamliy类似,这个方法是获取给定key的某个superColumnFamily的slice，这个slice中的元素都是superColumn</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; sct = cli.<span class="me1">get_slice_super</span><span class="br0">&#40;</span>tableName, keyName, superColumnFamily, <span class="nu0">0</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>16)<br />
//尝试删除一个superColumn节点，和属于该节点的column_t节点<br />
    //测试需要通过path来定位这个节点</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_remove_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumn = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;stardcolumninsuper1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamily+<span class="st0">&quot;:&quot;</span>+superColumn+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li2">
<div class="de2">       </div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//先建立一个super_column_family 名字测试的时候是&quot;superColumn3&quot;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生1个superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//首先产生1个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; Clist = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当两个名字一样的时候，先前的会被覆盖</span></div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper1&quot;</span>,<span class="st0">&quot;stardcolumn1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper2&quot;</span>,<span class="st0">&quot;stardcolumn2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生一个superColumn元素</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            superColumn_t sct = <span class="kw2">new</span> superColumn_t<span class="br0">&#40;</span>superColumnName , Clist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将这个元素装入到一个superColumn_t的List中</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; SClist = <span class="kw2">new</span> ArrayList&lt;superColumn_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            SClist.<span class="me1">add</span><span class="br0">&#40;</span>sct<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中</span></div>
</li>
<li class="li1">
<div class="de1">            Map&lt;String , List&lt;superColumn_t&gt;&gt; cfmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;superColumn_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cfmap.<span class="me1">put</span><span class="br0">&#40;</span>superColumnFamilyName, SClist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//区别于一般的，这里要求的column元素是superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将整理好的信息关联一个key后生成一个mutation</span></div>
</li>
<li class="li2">
<div class="de2">            batch_mutation_super_t bmst = <span class="kw2">new</span> batch_mutation_super_t<span class="br0">&#40;</span>tableName,keyName,cfmap<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw4">boolean</span> block = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个mutation的插入操作</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert_superColumn</span><span class="br0">&#40;</span>bmst, block<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">       </div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//尝试删除之</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">remove</span><span class="br0">&#40;</span>tableName, keyName, path, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>17)//这个方法目前还不健全</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_getProperty<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//这事一个未健全的方法，现在只能返回对应&quot;tables&quot;的参数，也就是表名</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;String&gt; Plist = cli.<span class="me1">getStringListProperty</span><span class="br0">&#40;</span><span class="st0">&quot;tables&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span> ; i &lt; Plist.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ; i++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>Plist.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">// TODO Auto-generated catch block</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//现在只支持如下三个参数</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;cluster name&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//会直接把server端的storage_conf.xml读进来,可能用于做进一步的xml分析</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;config file&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;version&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>一些注意的：<br />
1)cli的实例还有一些诸如sent_*和recv_*（成对出现）的公共方法，这些方法是供上面罗列的相应方法调用的，一般不用管，<br />
2)sent_*负责想服务器端发送消息<br />
3)recv_*将处理返回的所要的结果或处理错误信息抛出相应异常<br />
4)大部分方法可执行的前提是必须有一个精确的key信息,(describe_table和get_key_range除外)。<br />
5)一个superColumnFamily中只能存放superColumn_t元素而不能存放column_t元素<br />
6)一个columnFamily中只能存放column_t元素<br />
转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/14/4447359.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/14/4447359.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/682/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(3)</title>
		<link>http://www.javagg.com/archives/680</link>
		<comments>http://www.javagg.com/archives/680#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:54:20 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=680</guid>
		<description><![CDATA[当某个end point拿到一个key(比如&#8221;王老六&#8221;)并想取出他的相关信息的时候,这个节点是怎么知道这个key的相关信息是存放在哪些节点中的呢?
以下将用从客户端拿到的&#8221;get_clomun&#8221;请求为例，进行说明：
      &#8220;get_column&#8221;的相关信息会在CassandraServer的get_column(String tablename, String key, String columnPath)方法中被封装成一个readCommand实例，该对象简单包含了请求信息，另外也提供了一些别的方法。
      然后该command实例会最终被交给 StorageProxy.readProtocol(command,StorageService.ConsistencyLevel.WEAK)来处理，并期待这个方法能返回一个和key关联的columnFamily的数据，这些数据被装在一个row对象里返回的。
      在上述的StorageProxy.readProtocol(&#8230;)这个方法中，首先要做的事情就是根据提交的key(&#8220;王老六&#8221;)确定他的相关信息内容是存放在那些end point中的。而这个寻找end point的工作由StorageService.instance().getNStorageEndPoint(command.key)来完成。
      实际上，上述的StorageService的getNStorageEndPoint(String key)方法调用了他持有的实例&#8221;nodePicker_&#8221;的getStorageEndPoints(Token token) 来完成寻找end point这件事情。
      题外话：StorageService这个实例提供了本地节点数据存储和与其他节点交互的服务，这个实例是在节点启动之初被建立的，在建立的时候该实例会初始化一个nodePicker_放在其内部，这个nodePicker主要负责本地节点同其他节点的交互规则，也就是如何选择其他节点的策略。当前的策略有两种:RackAwareStrategy&#8211;机架敏感 和 RackUnawareStrategy&#8211;非机架敏感，默认策略是RackUnawareStrategy。
      所以默认情况下，nodePicker_就是一个RackUnawareStrategy实例，而他的 getStorageEndPoints(Token token)将被用来查找合适我们给出的key(&#8220;王老六&#8221;)的end point,这里合适的意思是“存有关于这个key的信息”。而这里提到的token是由key封装得来的，他对key进行了hash，并且继承了 Comparable接口。也就是说，这个token实例是可以和其他同类token比较大小的，而这样做的目的是为了“可以在Token组成的list 上进行二分查询Collection.binarySort，并定位查找目标的在list中的相对位置”&#8211;这种查找操作将被经常使用。默认情况下 token是一个BigIntegerToken的实例。
      nodePicker_最终会将查找的工作交给getStorageEndPoints(Token token, Map&#60;Token, EndPoint&#62; tokenToEndPointMap)来做，这个方法会返回一个查找到的end_point的数组。以下是对RackUnawareStrategy中的相应方法的说明（因为默认是使用这个方法）:
//此处的tokenToEndPointMap保存了该节点知道的所有其他节点，并且可以根据他们的token查找到
//此处的token是我们要查找的key(&#8220;王老五&#8221;)生成的token,他跟上面end point的token生成的算法是相同的，也都是BigIntegerToken



&#160;


public EndPoint&#91;&#93; getStorageEndPoints&#40;Token token, Map&#60;Token, EndPoint&#62; tokenToEndPointMap&#41;


    &#123;


        //根据key寻址的切入点


        int startIndex;


        List&#60;EndPoint&#62; list = new ArrayList&#60;EndPoint&#62;&#40;&#41;;


        int foundCount = 0;


        //将key的set装入一个ArrayList中，并完成排序，（一位token是comparable的）


        List [...]]]></description>
			<content:encoded><![CDATA[<p>当某个end point拿到一个key(比如&#8221;王老六&#8221;)并想取出他的相关信息的时候,这个节点是怎么知道这个key的相关信息是存放在哪些节点中的呢?<br />
以下将用从客户端拿到的&#8221;get_clomun&#8221;请求为例，进行说明：</p>
<p>      &#8220;get_column&#8221;的相关信息会在CassandraServer的get_column(String tablename, String key, String columnPath)方法中被封装成一个readCommand实例，该对象简单包含了请求信息，另外也提供了一些别的方法。<span id="more-680"></span></p>
<p>      然后该command实例会最终被交给 StorageProxy.readProtocol(command,StorageService.ConsistencyLevel.WEAK)来处理，并期待这个方法能返回一个和key关联的columnFamily的数据，这些数据被装在一个row对象里返回的。</p>
<p>      在上述的StorageProxy.readProtocol(&#8230;)这个方法中，首先要做的事情就是根据提交的key(&#8220;王老六&#8221;)确定他的相关信息内容是存放在那些end point中的。而这个寻找end point的工作由StorageService.instance().getNStorageEndPoint(command.key)来完成。</p>
<p>      实际上，上述的StorageService的getNStorageEndPoint(String key)方法调用了他持有的实例&#8221;nodePicker_&#8221;的getStorageEndPoints(Token token) 来完成寻找end point这件事情。</p>
<p>      题外话：StorageService这个实例提供了本地节点数据存储和与其他节点交互的服务，这个实例是在节点启动之初被建立的，在建立的时候该实例会初始化一个nodePicker_放在其内部，这个nodePicker主要负责本地节点同其他节点的交互规则，也就是如何选择其他节点的策略。当前的策略有两种:RackAwareStrategy&#8211;机架敏感 和 RackUnawareStrategy&#8211;非机架敏感，默认策略是RackUnawareStrategy。</p>
<p>      所以默认情况下，nodePicker_就是一个RackUnawareStrategy实例，而他的 getStorageEndPoints(Token token)将被用来查找合适我们给出的key(&#8220;王老六&#8221;)的end point,这里合适的意思是“存有关于这个key的信息”。而这里提到的token是由key封装得来的，他对key进行了hash，并且继承了 Comparable接口。也就是说，这个token实例是可以和其他同类token比较大小的，而这样做的目的是为了“可以在Token组成的list 上进行二分查询Collection.binarySort，并定位查找目标的在list中的相对位置”&#8211;这种查找操作将被经常使用。默认情况下 token是一个BigIntegerToken的实例。</p>
<p>      nodePicker_最终会将查找的工作交给getStorageEndPoints(Token token, Map&lt;Token, EndPoint&gt; tokenToEndPointMap)来做，这个方法会返回一个查找到的end_point的数组。以下是对RackUnawareStrategy中的相应方法的说明（因为默认是使用这个方法）:<br />
//此处的tokenToEndPointMap保存了该节点知道的所有其他节点，并且可以根据他们的token查找到</p>
<p>//此处的token是我们要查找的key(&#8220;王老五&#8221;)生成的token,他跟上面end point的token生成的算法是相同的，也都是BigIntegerToken</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> EndPoint<span class="br0">&#91;</span><span class="br0">&#93;</span> getStorageEndPoints<span class="br0">&#40;</span>Token token, Map&lt;Token, EndPoint&gt; tokenToEndPointMap<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//根据key寻址的切入点</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw4">int</span> startIndex;</div>
</li>
<li class="li1">
<div class="de1">        List&lt;EndPoint&gt; list = <span class="kw2">new</span> ArrayList&lt;EndPoint&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> foundCount = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//将key的set装入一个ArrayList中，并完成排序，（一位token是comparable的）</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">List</span></a> tokens = <span class="kw2">new</span> ArrayList&lt;Token&gt;<span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACollections+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">sort</span><span class="br0">&#40;</span>tokens<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//在排好序的tokens中二叉树搜索token，并返回token所在的位置的index</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//个人认为:根本别指望tokens里面能有我们要找的token，因为一个是end point的token集合,一个是查找key(&quot;王老六&quot;)生成的 </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//token，生成的时候都使用了hash，并且加入了大随即数，重合的概率很低。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//这样做的主要目的是为了获得下面这个index，（参见binarySearch的说明可知）。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//也就是：虽然下面这条语句不大可能从tokens中取出东西，但是生成的index将告诉我们，哪个end point的token离我们给出的</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//key&quot;王老六&quot;的token“最近”。而且，在节点情况固定下来的情况下，用当前这种方法，</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//key&quot;王老六&quot;的token确定的对应的end point也是不会改变的(每次都会取到这个end point，除非end point本身注册的变了)。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//也就是说：这就成了一种方法，一种能够根据数据key(&quot;王老六&quot;)定位到一个end point的方法，</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//如果写数据时使用了这种策略找到一个end point 节点然后写进数据，那么手持相应的key在读数据的时候，同样使用这个策略，也</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//相应的能找到当时存入数据的那个节点，并把数据读出来。</span></div>
</li>
<li class="li2">
<div class="de2">          <span class="kw4">int</span> index = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACollections+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">binarySearch</span><span class="br0">&#40;</span>tokens, token<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//基本上这个条件里面的语句肯定会被执行</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//那如果真的用key(&quot;王老六&quot;)从tokens中找到对应了呢？这个方法里的策略就是，那就直接拿这个被确定的节点来当 “邻居”节点了</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//而key的tokens和end_point的token之所以能混在一起说话，是因为他们都是BigIntegerToken，在同一个数据空间中</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw1">if</span><span class="br0">&#40;</span>index &lt; <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下的运算将把key(&quot;王老六&quot;)的&quot;邻居&quot;节点给&quot;翻译&quot;出来</span></div>
</li>
<li class="li2">
<div class="de2">            index = <span class="br0">&#40;</span>index + <span class="nu0">1</span><span class="br0">&#41;</span> * <span class="br0">&#40;</span><span class="nu0">-1</span><span class="br0">&#41;</span>;<span class="co1">//得到可以插入的位置</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span>index &gt;= tokens.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">                index = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> totalNodes = tokens.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">// Add the node at the index by default</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//把我们找到的&quot;邻居&quot;节点放到一个要返回的list中，当然,对于一个key(&quot;王老六&quot;)的信息还可能在其他节点上存有副本(replicas)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//再下面的操作会将这些存有副本的节点也一同取出</span></div>
</li>
<li class="li2">
<div class="de2">        list.<span class="me1">add</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>index<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        foundCount++;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//本来index是从0&#8230;一直到size()的一条线，如果我们用如下的方式选取index，就好似将所有的index数值放在了一个圆圈上，然后按</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//从小到大的方向在选取下一个index。startIndex就是一个切入点，本质上Partitioner提供了这个可被&quot;切入&quot;的结构和线索</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//猜想这也是为什么叫Partitioner的原因吧</span></div>
</li>
<li class="li1">
<div class="de1">        startIndex = <span class="br0">&#40;</span>index + <span class="nu0">1</span><span class="br0">&#41;</span>%totalNodes;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">// If we found N number of nodes we are good. This loop will just exit. Otherwise just</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">// loop through the list and add until we have N nodes.</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">// replicas_对应storage-conf.xml中的最大副本数量</span></div>
</li>
<li class="li1">
<div class="de1">   </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//将存有副本的节点也一同取出，就是最初&quot;邻居&quot;节点往后的若干个节点，具体若干几个是在storage-conf.xml的</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//&lt;ReplicationFactor&gt;标签中定义的</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = startIndex, count = <span class="nu0">1</span>; count &lt; totalNodes &amp;amp;&amp;amp; foundCount &lt; replicas_; ++count, i = <span class="br0">&#40;</span>i<span class="nu0">+1</span><span class="br0">&#41;</span>%totalNodes<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span> ! list.<span class="me1">contains</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                list.<span class="me1">add</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                foundCount++;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//统一下节点监听端口的信息</span></div>
</li>
<li class="li1">
<div class="de1">        retrofitPorts<span class="br0">&#40;</span>list<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">return</span> list.<span class="me1">toArray</span><span class="br0">&#40;</span><span class="kw2">new</span> EndPoint<span class="br0">&#91;</span>list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/14/4446665.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/14/4446665.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(2)</title>
		<link>http://www.javagg.com/archives/678</link>
		<comments>http://www.javagg.com/archives/678#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:53:23 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=678</guid>
		<description><![CDATA[源码中对节点的如下称呼应该是等价的: end point , node ,  machine , datacenter , host。
    cassandra节点的启动main()在类org.apache.cassandra.service.CassandraDaemon中，细节在 setup()中。过程中会start一个CassandraServer的实例peerStorageServer。 peerStorageServer在建立的时候，内部会实例化一个 StorageService实例，在该StorageService实例初始化的过程中，该节点的所有功能服务会被配置激活，这些操作是在 StorageService的默认构造器中完成的。
    StorageService的构造器中大致做了如下几件事情：
    1)生成一个storageLoadBalancer_s实例负责负载均衡，现在还没有明白原理。
    2)生成一个endPointSnitch_实例，这个提供了对两个end_point进行比较的一个途径，基本上是判断两个end_point是不是同一个ip等
    3)启动了MessagingService，并且注册了一些handler实例。MessagingService是负责该end_point与其他end_point进行通信的。两个节点间通信的内容被封装在一个Message的实例里面。
       比如，如果节点A想向节点B获得一定的数据，那么A需要通过自己的MessageService向节点B发送一个Message实例，这个实例里面包含了如下信息：这个请求的类型（属于什么stage） ，这个请求要调用的B的哪个handler来处理，以及这个请求的其他具体内容。当节点B接收到节点A发送过来的Message实例后，会将根据这个 Message实例内部指定的handler信息,将该实例转发相应的handler去处理。当然这样做的前提是这个指定的handler已经在B节点注册了，而这个注册过程就是在StorageService启动的时候完成的。
    4)consistencyManager_：还没明白什么意思。
    5)StageManager的配置：
       这个stage的概念来自于“SEDA“( staged event driven architecture)中的&#8221;S&#8221;,参考http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf。
       大致意思好像是可以将一个工作流程分为若干个阶段(stage)，然后给各个stage动态的分配线程资源来处理stage内定义的逻辑。stage和 stage之间的通信是通过任务队列完成的，当一个stage的逻辑执行完后，如果需要调用下一个stage来继续执行，那么就往下一个stage保有的任务队列中写入必要的任务信息。
       这样的SEDA结构的好处是：在实际的运行当中各个stage的忙闲程度是不一样的，可以通过将比较闲的stage上的线程资源分配给同期比较忙的stage来实现效率上的提高。
       在cassandra中，还是以3)中例子说明，在A节点发往B节点的Message实例中有一个“这个请求的类型”的信息，这个信息保存在 Message实例内header实例的type_上，是一个字符串。这个字符串标明了当MessageService获取了Message实例后究竟由那个 stage来负责执行指定的handler对象。因为handler对象只是定义了对Message的处理逻辑，所以需要stage里面的线程来对其进行执行。
       当前的stage只有4种，依次在StroageService的 /* All stage identifiers */标注下被定义，分别负责不同的任务，“ROW-READ-STAGE”是负责读取的，其他的含义还没有完全搞清楚，大概是负责修改，数据压缩和 http后台页面信息接收的。
       StageManager部分的源码还没哟看到，可能是负责各个stage间线程调度的吧。
    6)设置nodepicker_定义了当前节点对周围节点的查询策略，具体的还不清楚
转：http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx
]]></description>
			<content:encoded><![CDATA[<p>源码中对节点的如下称呼应该是等价的: end point , node ,  machine , datacenter , host。</p>
<p>    cassandra节点的启动main()在类org.apache.cassandra.service.CassandraDaemon中，细节在 setup()中。过程中会start一个CassandraServer的实例peerStorageServer。 peerStorageServer在建立的时候，内部会实例化一个 StorageService实例，在该StorageService实例初始化的过程中，该节点的所有功能服务会被配置激活，这些操作是在 StorageService的默认构造器中完成的。<span id="more-678"></span></p>
<p>    StorageService的构造器中大致做了如下几件事情：</p>
<p>    1)生成一个storageLoadBalancer_s实例负责负载均衡，现在还没有明白原理。</p>
<p>    2)生成一个endPointSnitch_实例，这个提供了对两个end_point进行比较的一个途径，基本上是判断两个end_point是不是同一个ip等</p>
<p>    3)启动了MessagingService，并且注册了一些handler实例。MessagingService是负责该end_point与其他end_point进行通信的。两个节点间通信的内容被封装在一个Message的实例里面。</p>
<p>       比如，如果节点A想向节点B获得一定的数据，那么A需要通过自己的MessageService向节点B发送一个Message实例，这个实例里面包含了如下信息：这个请求的类型（属于什么stage） ，这个请求要调用的B的哪个handler来处理，以及这个请求的其他具体内容。当节点B接收到节点A发送过来的Message实例后，会将根据这个 Message实例内部指定的handler信息,将该实例转发相应的handler去处理。当然这样做的前提是这个指定的handler已经在B节点注册了，而这个注册过程就是在StorageService启动的时候完成的。</p>
<p>    4)consistencyManager_：还没明白什么意思。</p>
<p>    5)StageManager的配置：</p>
<p>       这个stage的概念来自于“SEDA“( staged event driven architecture)中的&#8221;S&#8221;,参考<a href="http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf">http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf</a>。</p>
<p>       大致意思好像是可以将一个工作流程分为若干个阶段(stage)，然后给各个stage动态的分配线程资源来处理stage内定义的逻辑。stage和 stage之间的通信是通过任务队列完成的，当一个stage的逻辑执行完后，如果需要调用下一个stage来继续执行，那么就往下一个stage保有的任务队列中写入必要的任务信息。</p>
<p>       这样的SEDA结构的好处是：在实际的运行当中各个stage的忙闲程度是不一样的，可以通过将比较闲的stage上的线程资源分配给同期比较忙的stage来实现效率上的提高。</p>
<p>       在cassandra中，还是以3)中例子说明，在A节点发往B节点的Message实例中有一个“这个请求的类型”的信息，这个信息保存在 Message实例内header实例的type_上，是一个字符串。这个字符串标明了当MessageService获取了Message实例后究竟由那个 stage来负责执行指定的handler对象。因为handler对象只是定义了对Message的处理逻辑，所以需要stage里面的线程来对其进行执行。</p>
<p>       当前的stage只有4种，依次在StroageService的 /* All stage identifiers */标注下被定义，分别负责不同的任务，“ROW-READ-STAGE”是负责读取的，其他的含义还没有完全搞清楚，大概是负责修改，数据压缩和 http后台页面信息接收的。</p>
<p>       StageManager部分的源码还没哟看到，可能是负责各个stage间线程调度的吧。</p>
<p>    6)设置nodepicker_定义了当前节点对周围节点的查询策略，具体的还不清楚</p>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/678/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(1)</title>
		<link>http://www.javagg.com/archives/676</link>
		<comments>http://www.javagg.com/archives/676#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:51:51 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[我的日记]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=676</guid>
		<description><![CDATA[1). cassandra任何一个节点都可以被客户端访问。
2). 对cassandra某个节点的访问是通过调用org.apache.cassandra.service.Cassandra的内部类Client的相应接口实现的。
3). 2)中的Cassandra这个类包含了很多内部类和一个接口（Iface）。其中的Client和Processor两个内部类都是对Iface的实现，这保证了他们的内部的所有方法是一一对应的。
4). 当Client这个内部类中的某个方法被调用的时候，该方法会用他内部的send_开头的方法发送消息，并且用recv_开头的方法接收返回的内容，容，返回的内容可能是我们想要的数据，也可能是个异常的消息，如果是异常的消息，则会在客户端生成一个相应的异常并抛出，
5). Client端send_和recv_方法同目标节点的交互是分别通过oprot和iprot的实例完成的，这两个实例是负责输入输出的，具体的功能的实现在libthrift.jar中。
6). 节点和客户端通信的连接是由libthrift.jar中的TThreadPoolServer的实例实现的，这个实例在该节点最初启动的时候被生成，并且该实例内部还保有一个2)中提到的Processor实例。TThreadPoolServer实例给Processor实例提供了输入输出实例iprot和oprot,并且通过调用Processor的processprocess(TProtocol iprot, TProtocol oprot)接口来进一步的向内传递消息。
7). 节点最初启动的初始话过程是在org.apache.cassandra.service.CassandraDaemon的setup()中完成的。
  . 在Processor的processprocess(TProtocol iprot, TProtocol oprot)会解析iprot中传入的客户端的请求，并首先解析出要调用函数的函数名字，然后通过查询processMap_来决定究竟由那个ProcessFunction实例来接收处理消息,相应的ProcessFunction实例的process(int seqid, TProtocol iprot, TProtocol oprot)被激活并开始全权负责消息的处理和反馈。
9). 相应的的ProcessFunction的实例主要负责三件事：i，进一步处理iprot传入的消息 ii，将详细的信息转发给iface的相应方法处理 iii，将得到的反馈通过oprot返回给客户端。这里的iface实例实际上是org.apache.cassandra.service.CassandraServer的一个实例，在Processor的实例创建的时候(节点启动的时候)被装入了Processor实例,但是由于ProcessFunction类是Processor的内部类，所以ProcessFunction的实例也能直接访问。
10)以上可知，最终客户端的信息是交给CassandraServer的相应方法来处理的，而thrift的相关功能只是负责了客户端和节点间的交互（9160端口），而节点之间的交互并没有使用thrift的资源。
 转：http://blog.csdn.net/pakly_9527/archive/2009/08/12/4438810.aspx
]]></description>
			<content:encoded><![CDATA[<p>1). cassandra任何一个节点都可以被客户端访问。</p>
<p>2). 对cassandra某个节点的访问是通过调用org.apache.cassandra.service.Cassandra的内部类Client的相应接口实现的。</p>
<p>3). 2)中的Cassandra这个类包含了很多内部类和一个接口（Iface）。其中的Client和Processor两个内部类都是对Iface的实现，这保证了他们的内部的所有方法是一一对应的。<span id="more-676"></span></p>
<p>4). 当Client这个内部类中的某个方法被调用的时候，该方法会用他内部的send_开头的方法发送消息，并且用recv_开头的方法接收返回的内容，容，返回的内容可能是我们想要的数据，也可能是个异常的消息，如果是异常的消息，则会在客户端生成一个相应的异常并抛出，</p>
<p>5). Client端send_和recv_方法同目标节点的交互是分别通过oprot和iprot的实例完成的，这两个实例是负责输入输出的，具体的功能的实现在libthrift.jar中。</p>
<p>6). 节点和客户端通信的连接是由libthrift.jar中的TThreadPoolServer的实例实现的，这个实例在该节点最初启动的时候被生成，并且该实例内部还保有一个2)中提到的Processor实例。TThreadPoolServer实例给Processor实例提供了输入输出实例iprot和oprot,并且通过调用Processor的processprocess(TProtocol iprot, TProtocol oprot)接口来进一步的向内传递消息。</p>
<p>7). 节点最初启动的初始话过程是在org.apache.cassandra.service.CassandraDaemon的setup()中完成的。</p>
<p> <img src='http://www.javagg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> . 在Processor的processprocess(TProtocol iprot, TProtocol oprot)会解析iprot中传入的客户端的请求，并首先解析出要调用函数的函数名字，然后通过查询processMap_来决定究竟由那个ProcessFunction实例来接收处理消息,相应的ProcessFunction实例的process(int seqid, TProtocol iprot, TProtocol oprot)被激活并开始全权负责消息的处理和反馈。</p>
<p>9). 相应的的ProcessFunction的实例主要负责三件事：i，进一步处理iprot传入的消息 ii，将详细的信息转发给iface的相应方法处理 iii，将得到的反馈通过oprot返回给客户端。这里的iface实例实际上是org.apache.cassandra.service.CassandraServer的一个实例，在Processor的实例创建的时候(节点启动的时候)被装入了Processor实例,但是由于ProcessFunction类是Processor的内部类，所以ProcessFunction的实例也能直接访问。</p>
<p>10)以上可知，最终客户端的信息是交给CassandraServer的相应方法来处理的，而thrift的相关功能只是负责了客户端和节点间的交互（9160端口），而节点之间的交互并没有使用thrift的资源。</p>
<p> 转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/12/4438810.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/12/4438810.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/676/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

