Random/Timer/Java Disabuse(解惑)/StAX

一、Random

1、创建Random类型的对象:

 

Random random = new Random();//默认构造方法

Random random = new Random(10010010);//指定种子数字

 

2、生成随机数字:

 

生成随机整数:

int k = random.nextInt();

 

生成随机长整数:

long l = random.nextLong();

 

3、生成指定范围的数字:

 

例如生成0-10之间的随机数字:

 int k = random.nextInt();

int j = Math.abs(k % 10);

 

//直接方式:rand.nextInt(range);

int i =random.nextInt(10);

 

获得10-20之间的随机数字:

int k = random.nextInt();

int j = Math.abs(k % 10) + 10;

 

int i = (int)(Math.random()*1000)

 

random对象的nextInt(),nextInt(int n)说明:

 

int nextInt()
  返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。  有正有负。

int nextInt(int n)
  返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。

 

4、next(int bits)

 

        next(n)产生2的n次方之内的随机数,next(32)产生2的32次方之内的随机数,就相当于nextInt()了。

 

5、setSeed(long seed)

 

       setSeed(long seed) 用于设定随机数的种子,即这里的seed。随机数种子的用处是:一般说来,这里的Random类产生随机数是伪随机数,是系统采用特定的算法生成出来的,方法是new两个Random类random1和random2。各自调用nextInt方法10次,我们可以看出,虽然各自产生的是随机数,但是两个Random类产生的随机数都是一样的。这就使得随机数存在着漏洞。

 

二、java disabuse

 

	/***********双括弧初始化:内层的花括号就是匿名类的初始化子句************/
	@SuppressWarnings("unchecked")
	private static Map map = new HashMap() {{   
	    put("id", "20090501");   
	    put("name", "name1");
	    put("age","20");
	}};  

	private static final Set<String> set = new HashSet<String>() {{   
	       add("lucy");   
	       add("lily");   
	       add("frank");   
	       add("bruce");   
	}};  
	
	public static void printSet(Set set){
		Iterator it = set.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
	
	public static void printMap(Map map) { 
        for (Object key : map.keySet()) {   
            System.out.println(key + ":" + map.get(key));   
        }  
	}
	
	public static void printSelf() {
		// 正则表达式“.”可以匹配任何单个的字符,要转义
		System.out.println(JavaDisabuse.class.getName().replaceAll("\\.", "/")
				+ ".class");
		// java.util.regex.Pattern.quote。它接受一个字符串作为参数,并可以添加必
		// 需的转义字符,它将返回一个正则表达式字符串
		System.out.println(JavaDisabuse.class.getName().replaceAll(
				Pattern.quote("."), "/")+ ".class");
		
		//java.util.regex.Matcher.quoteReplacement,它将字
		//符串转换成相应的替代字符串。
		System.out.println(JavaDisabuse.class.getName().replaceAll("\\.",
				Matcher.quoteReplacement(File.separator)) + ".class");
		
		System.out.println(JavaDisabuse.class.getName().
				replace('.', File.separatorChar) + ".class");
	}

	/** ***********提防溢出*************** */
	public static void longDivision() {
		final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;// 乘完后(已溢出)转型
		final long MICROS_PER_DAY_L = 24L * 60 * 60 * 1000 * 1000;
		final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;

		System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);// 5
		System.out.println(MICROS_PER_DAY_L / MILLIS_PER_DAY);// 1000
	}

	/** ***********执行精确小数运算********* */
	public static BigDecimal subtract(String arg0, String arg1) {
		// 问题在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
		// 接近它的double值。
		System.out.println(2.00 - 1.10);// 二进制浮点数的double运算:0.8999999999999999
		return new BigDecimal(arg0).subtract(new BigDecimal(arg1));// 0.90
	}

	/** *******求奇数(莫用i%2==1,负数失效)********* */
	public static boolean isOdd(int i) {
		return i % 2 != 0;
	}

	public static boolean isOdd1(int i) {
		return (i & 1) != 0;
	}

 三、Timer和TimerTask

public class JavaTimer {

	/**
	 * 延迟执行任务
	 * @param task
	 * @param delay
	*/
	public void delayDoTask(TimerTask task, long delay){
		Timer t = new Timer();
		t.schedule(task, delay);
	}
	
	/**
	 * 间隔执行任务
	 * @param task
	 * @param delay
	*/
	public void internalDoTask(TimerTask task, long delay, long period){
		Timer t = new Timer();
		t.schedule(task, delay, period);
	}
	
	public class HomeWork extends TimerTask{
		String id = "ID_"+Math.round(Math.random()*100000);
		int times = 0; 
		public void run() {
			System.out.println(id + " do homework " + (++times) + " times!");
			if(times > 5){
				this.cancel();//取消任务
				System.exit(0);
			}
		}
	}

	public static void main(String args[]){
		JavaTimer timer = new JavaTimer();
		timer.delayDoTask(timer.new HomeWork(), 1*1000);
		timer.internalDoTask(timer.new HomeWork(), 500, 1*1000);
	}
	
}

 四、关于StAX

        从一开始,Java API for XML Processing (JAXP) 就提供了两种方法来处理 XML:文档对象模型(DOM)方法是用标准的对象模型表示 XML 文档;Simple API for XML (SAX) 方法使用应用程序提供的事件处理程序来处理 XML。JSR-173 提出了一种面向流的新方法:Streaming API for XML (StAX)。

        StAX 实际上包括两套处理 XML 的 API,分别提供了不同程度的抽象。基于指针的 API 允许应用程序把 XML 作为一个标记(或事件)流来处理;应用程序可以检查解析器的状态,获得解析的上一个标记的信息,然后再处理下一个标记,依此类推。这是一种低层 API,尽管效率高,但是没有提供底层 XML 结构的抽象。较为高级的基于迭代器的 API 允许应用程序把 XML 作为一系列事件对象来处理,每个对象和应用程序交换 XML 结构的一部分。应用程序只需要确定解析事件的类型,将其转换成对应的具体类型,然后利用其方法获得属于该事件的信息。

(1)StAXReader

public class StAXReader {

	/**
	 * 使用基于底层指针的 API: XMLStreamReader解析输入流
	 * @param fileName
	 */
	public static void parseByXMLStreamReader(String fileName) throws Exception{
		XMLStreamReader reader = null;
		PrintStream out = System.out; 
		try{
			XMLInputFactory factory = XMLInputFactory.newInstance();
			reader = factory.createXMLStreamReader(new FileReader(fileName));
			
			int event = reader.getEventType();
			while (true) {
				switch (event) {
					case XMLStreamConstants.START_DOCUMENT://一个文档的开始
						out.println("Start Document.");
						break;
						
					case XMLStreamConstants.START_ELEMENT://一个元素的开始
						out.println("Start Element: " + reader.getName().getLocalPart());
						for(int i = 0, n = reader.getAttributeCount(); i < n; ++i)
							out.println("Attribute: " + reader.getAttributeName(i) 
									+ "=" + reader.getAttributeValue(i));
						break;
						
					case XMLStreamConstants.CHARACTERS://字符可以是文本,或是一个空格
					case XMLStreamConstants.SPACE://可忽略的空格
						if (reader.isWhiteSpace())
							break;
						
						int start = reader.getTextStart();
						int length = reader.getTextLength();
						String text =
						new String(reader.getTextCharacters(), start, length);
						
						out.println("Text: " + text);
						break;
					
					case XMLStreamConstants.COMMENT ://一个注释
					case XMLStreamConstants.PROCESSING_INSTRUCTION ://处理指令
						out.println("Text: " + reader.getText());
						break;
						
					case XMLStreamConstants.END_ELEMENT://结束元素
						out.println("End Element:" + reader.getName().getLocalPart());
						break;
						
					case XMLStreamConstants.END_DOCUMENT://结束文档
						out.println("End Document.");
						break;
				}
			 
				if (!reader.hasNext())
					break;

				event = reader.next();
			 }
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("解析XML文件时出错!", e);
		}finally{
			if(null != reader){
				reader.close();
			}
		}
	}
	
	/**
	 * 使用迭代器风格的 API: XMLEventReader解析输入流
	 * @param fileName
	 */
	public static void parseByXMLEventReader(String fileName) throws Exception{
		XMLEventReader reader = null;
		PrintStream out = System.out; 
		try{
			XMLInputFactory factory = XMLInputFactory.newInstance();
			reader = factory.createXMLEventReader(new FileReader(fileName));
			
			while(reader.hasNext()){
				XMLEvent evt = reader.nextEvent();
				switch(evt.getEventType()){
					case XMLEvent.START_DOCUMENT:
						String version = ((StartDocument) evt).getVersion();
						String encoding = ((StartDocument) evt).getCharacterEncodingScheme();
						boolean isStandAlone = ((StartDocument) evt).isStandalone();
						out.println("Start Document.");
						if(null != version) out.println("version: " + version);
						if(null != encoding) out.println("encoding: "+ encoding);
						out.println("isStandAlone: "+isStandAlone);
						break;
					case XMLEvent.START_ELEMENT:
						QName qname = ((StartElement) evt).getName();
						String localName = qname.getLocalPart();
						out.println("Start Element: " + localName);
						Iterator<?> it = ((StartElement) evt).getAttributes();
						while (it.hasNext()) {
							Attribute attr = (Attribute) it.next();
							QName attrName = attr.getName();
							String attrValue = attr.getValue();
							out.println("Attribute: "+ attrName.getLocalPart() +" = "+attrValue);
						}
						break;
					case XMLEvent.END_ELEMENT:
						QName qname_end = ((EndElement) evt).getName();
						out.println("End Element: " + qname_end.getLocalPart());
						break;
					case XMLEvent.CHARACTERS:
						String text = ((Characters) evt).getData();
						if(null != text && !text.replaceAll("\\s+", "").equals("")){
							out.println("Text: " + text);
						}
						break;
					case XMLEvent.COMMENT:
						out.println("Comment: " + ((Comment) evt).getText());
						break;
					case XMLEvent.END_DOCUMENT:
						out.println("End Document.");
						break;
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("解析XML文件时出错!", e);
		}finally{
			if(null != reader){
				reader.close();
			}
		}
	}
	
	/**
	 * 读指定节点下的值
	 * 如:<properties>
	 *   <property name="port" description="服务器所使用的端口">
	 *      <field>80</field>
	 *   </property>
	 *   </properties>
	 * @param fileName
	 * @param nodeName
	 * @throws Exception
	 */
	public static void readXMLNodeProperty(String fileName, String nodeName) throws Exception{
		XMLEventReader reader = null;
		PrintStream out = System.out; 
		try{
			XMLInputFactory factory = XMLInputFactory.newInstance();
			reader = factory.createXMLEventReader(new FileReader(fileName));
			
			while(reader.hasNext()){
				XMLEvent evt = reader.nextEvent();
				if(evt.getEventType() == XMLEvent.START_ELEMENT){
					StartElement el = (StartElement)evt;
					Attribute attr = el.getAttributeByName(new QName("name"));//具有name属性的节点
					String startTag = el.getName().getLocalPart();//节点标签
					
					if(null != attr && attr.getValue().equals(nodeName)){//根据name的值确定是否是想找的节点
						
						while(reader.hasNext()){//循环其后节点
							evt = reader.nextEvent();
							if(evt.getEventType() == XMLEvent.END_ELEMENT){
								if(((EndElement)evt).getName().getLocalPart().equals(startTag)){//节点结束标签
									break;
								}
							}
							if(evt.getEventType() == XMLEvent.CHARACTERS){//是文本节点,包括了空白符
								String text = ((Characters) evt).getData();
								if(!text.replaceAll("\\s+", "").equals("")){
									out.println(nodeName + " = " + text);
									break;
								}
							}
						}
						
					}
					
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("读取XML过程中出错!", e);
		}finally{
			if(null != reader){
				reader.close();
			}
		}
	}
	
}

 

(2).StAXWriter

public class StAXWriter {

	/**
	 * 基于Cursor
	 * @throws XMLStreamException
	 */
	public static void writeByXMLStreamWriter() throws XMLStreamException{
		final String XHTML_NS = "http://www.w3.org/1999/xhtml";//Namespace
		XMLOutputFactory f = XMLOutputFactory.newInstance();
		XMLStreamWriter w = f.createXMLStreamWriter(System.out);
		try {
			w.writeStartDocument("GBK", "1.0");//Encoding And Version
			w.writeCharacters("\n");
			
			w.writeDTD("<!DOCTYPE html " +
			          "PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " +
			          "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
			w.writeCharacters("\n");
			
			w.writeComment(" This is a comment! ");//注释
			w.writeCharacters("\n");
			
			w.writeStartElement("html");
			w.writeDefaultNamespace(XHTML_NS);//在当前元素上声明默认名称空间
			w.writeAttribute("lang", "en");
			w.writeCharacters("\n");
			
			w.writeStartElement(XHTML_NS, "head");//名称空间URI 和本地名称
			w.writeCharacters("\n");
			
			w.writeStartElement(XHTML_NS, "title");
			w.writeCharacters("Test");
			w.writeEndElement();//end <title>
			
			w.writeCharacters("\n");
			w.writeEndElement();//end <head>
			w.writeCharacters("\n");
			
			w.writeStartElement(XHTML_NS, "body");
			w.writeCharacters("This is a test.");
			w.writeCData("This is a CData content!");//可以将文本包装在 CDATA 块中
			w.writeEndElement();//end <body>
			
			w.writeCharacters("\n");
			w.writeEndElement();//end <html>
			w.writeEndDocument();
		}finally{
			w.flush();//促使编写器将任何缓存的数据写入底层输出
		    w.close();//关闭编写器对象:关闭方法只释放编写器需要的资源,并不关闭底层的输出。
		}		
	}
	
	/**
	 * 基于Event
	 * @throws XMLStreamException
	 */
	public static void writeByXMLEventWriter() throws XMLStreamException{
		final String XHTML_NS = "http://www.w3.org/1999/xhtml";
		final QName HTML_TAG = new QName(XHTML_NS, "html");
		final QName HEAD_TAG = new QName(XHTML_NS, "head");
		final QName TITLE_TAG = new QName(XHTML_NS, "title");
		final QName BODY_TAG = new QName(XHTML_NS, "body");
		
		XMLOutputFactory f = XMLOutputFactory.newInstance();
		XMLEventWriter w = f.createXMLEventWriter(System.out);
		XMLEventFactory ef = XMLEventFactory.newInstance();
		try {
			/*
			 * add(XMLEventReader) 是一个很方便的方法,用它可以写出从读取器获得的全部事件。
			 * 使用这个方法,应用程序可以将整个 XML 流的内容有效地输送到另一个 XML 流,而且内容保持不变。
			 * add(XMLEvent) 写出从读取器获得的事件
			 */
			w.add(ef.createStartDocument());
			w.add(ef.createIgnorableSpace("\n"));
			w.add(ef.createDTD("<!DOCTYPE html " +
			          "PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " +
			          "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"));
			w.add(ef.createIgnorableSpace("\n"));
			
			w.add(ef.createStartElement(HTML_TAG, null, null));
			w.add(ef.createNamespace(XHTML_NS));
			w.add(ef.createAttribute("lang", "en"));
			w.add(ef.createIgnorableSpace("\n"));
			
			w.add(ef.createStartElement(HEAD_TAG, null, null));
			w.add(ef.createIgnorableSpace("\n"));
			
			w.add(ef.createStartElement(TITLE_TAG, null, null));
			w.add(ef.createCharacters("Test"));
			w.add(ef.createEndElement(TITLE_TAG, null));
			
			w.add(ef.createEndElement(HEAD_TAG, null));
			w.add(ef.createIgnorableSpace("\n"));
			
			w.add(ef.createStartElement(BODY_TAG, null, null));
			w.add(ef.createCharacters("This is a test."));
			w.add(ef.createEndElement(BODY_TAG, null));
			w.add(ef.createIgnorableSpace("\n"));
			
			w.add(ef.createEndElement(HTML_TAG, null));
			w.add(ef.createEndDocument());
		} finally {
			w.flush();
			w.close();
		}
	}
	
}

 

	/**
	 * 直接将Java Bean 转化成XML
	 * @param obj
	 */
	public static void convertObjectToXMLByXMLEncoder(Object obj){
		try{
			java.beans.XMLEncoder encoder = new XMLEncoder(System.out);
			encoder.writeObject(obj); 
			encoder.close(); 
		}catch(Exception e){
			e.printStackTrace();
		}
	}

 附:xstream实现java对象与XML互转

地址:http://xstream.codehaus.org/index.html

你可能感兴趣的:(java,xml,应用服务器,正则表达式,XHTML)