﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-勇敢的心-文章分类-JAVA大本营</title><link>http://www.blogjava.net/liyong/category/17288.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:55:31 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:55:31 GMT</pubDate><ttl>60</ttl><item><title>Java打包指南－JAR文件包及jar命令详解</title><link>http://www.blogjava.net/liyong/articles/84377.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 29 Nov 2006 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/84377.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/84377.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/84377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/84377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/84377.html</trackback:ping><description><![CDATA[
		<span class="top11" twffan="done"> 
<p></p><p>常常在网上看到有人询问：如何把 java 程序编译成 .exe 文件。通常回答只有两种，一种是制作一个可执行的 JAR 文件包，然后就可以像.chm 文档一样双击运行了；而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的，而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件，性能也要打些折扣。所以，使用制作可执行 JAR 文件包的方法就是最佳选择了，何况它还能保持Java 的跨平台特性。 <br /><br />下面就来看看什么是 JAR 文件包吧： </p><p>1. JAR 文件包 <br /><br />JAR 文件就是 Java Archive File，顾名思意，它的应用是与 Java 息息相关的，是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说，它就是 ZIP 文件，所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中，包含了一个 META-INF/MANIFEST.MF 文件，这个文件是在生成 JAR 文件的时候自动创建的。举个例子，如果我们具有如下目录结构的一些文件： <br /><br />== <br /><br />`-- test <br /><br />　 `-- Test.class <br /><br />把它压缩成 ZIP 文件 test.zip，则这个 ZIP 文件的内部目录结构为： <br /><br />test.zip <br /><br />`-- test <br /><br />　 `-- Test.class <br /><br />如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar，则这个 JAR 文件的内部目录结构为： <br /><br />test.jar <br /><br />|-- META-INF <br /><br />|　 `-- MANIFEST.MF <br /><br />`-- test <br /><br />`--Test.class <br /><br />2. 创建可执行的 JAR 文件包 <br /><br />制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。 <br /><br />Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放；运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数；运行时还要到控制台下去使用 java 命令来运行，如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此，许多人说，Java 是一种方便开发者苦了用户的程序设计语言。 <br /><br />其实不然，如果开发者能够制作一个可执行的 JAR 文件包交给用户，那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候，安装文件会将 .jar 文件映射给 javaw.exe 打开。那么，对于一个可执行的 JAR 文件包，用户只需要双击它就可以运行程序了，和阅读 .chm 文档一样方便 (.chm 文档默认是由 hh.exe 打开的)。那么，现在的关键，就是如何来创建这个可执行的 JAR 文件包。 <br /><br />创建可执行的 JAR 文件包，需要使用带 cvfm 参数的 jar 命令，同样以上述 test 目录为例，命令如下： <br /><br />jar cvfm test.jar manifest.mf test <br /><br />这里 test.jar 和 manifest.mf 两个文件，分别是对应的参数 f 和 m，其重头戏在 manifest.mf。因为要创建可执行的 JAR 文件包，光靠指定一个 manifest.mf 文件是不够的，因为 MANIFEST 是 JAR 文件包的特征，可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST，其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下： <br /><br />Main-Class: 可执行主类全名(包含包名) <br /><br />例如，假设上例中的 Test.class 是属于 test 包的，而且是可执行的类 (定义了 public static void main(String[]) 方法)，那么这个 manifest.mf 可以编辑如下： <br /><br />Main-Class: test.Test &lt;回车&gt; <br /><br />这个 manifest.mf 可以放在任何位置，也可以是其它的文件名，只需要有 Main-Class: test.Test 一行，且该行以一个回车符结束即可。创建了 manifest.mf 文件之后，我们的目录结构变为： <br /><br />== <br /><br />|-- test <br /><br />|　 `-- Test.class <br /><br />`-- manifest.mf <br /><br />这时候，需要到 test 目录的上级目录中去使用 jar 命令来创建 JAR 文件包。也就是在目录树中使用“==”表示的那个目录中，使用如下命令： <br /><br />jar cvfm test.jar manifest.mf test <br /><br />之后在“==”目录中创建了 test.jar，这个 test.jar 就是执行的 JAR 文件包。运行时只需要使用 java -jar test.jar 命令即可。 <br /><br />需要注意的是，创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构，就像上例一样。而 Main-Class 指定的类，也必须是完整的、包含包路径的类名，如上例的 test.Test；而且在没有打成 JAR 文件包之前可以使用 java &lt;类名&gt; 来运行这个类，即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下)。 <br /><br />3. jar 命令详解 <br /><br />jar 是随 JDK 安装的，在 JDK 安装目录下的 bin 目录中，Windows 下文件名为 jar.exe，Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做，因为 SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 放到 CLASSPATH 中。 <br /><br />使用不带任何的 jar 命令我们可以看到 jar 命令的用法如下： <br /><br />jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... <br /><br />其中 {ctxu} 是 jar 命令的子命令，每次 jar 命令只能包含 ctxu 中的一个，它们分别表示： <br /><br />　-c　创建新的 JAR 文件包 <br /><br />　-t　列出 JAR 文件包的内容列表 <br /><br />　-x　展开 JAR 文件包的指定文件或者所有文件 <br /><br />　-u　更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中) <br /><br />　[vfm0M] 中的选项可以任选，也可以不选，它们是 jar 命令的选项参数 <br /><br />　-v　生成详细报告并打印到标准输出 <br /><br />　-f　指定 JAR 文件名，通常这个参数是必须的 <br /><br />　-m　指定需要包含的 MANIFEST 清单文件 <br /><br />　-0　只存储，不压缩，这样产生的 JAR 文件包会比不用该参数产生的体积大，但速度更快 <br /><br />　-M　不产生所有项的清单（MANIFEST〕文件，此参数会忽略 -m 参数 <br /><br />　[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包，它是 -f 参数的附属参数 <br /><br />　[manifest-文件] 即 MANIFEST 清单文件，它是 -m 参数的附属参数 <br /><br />　[-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令，它只能在创建和更新 JAR 文件包的时候可用。 <br /><br />文件名 ... 指定一个文件/目录列表，这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录，那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。 <br /><br />下面举一些例子来说明 jar 命令的用法： <br /><br />1) jar cf test.jar test <br /><br />该命令没有执行过程的显示，执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar，那么该文件将被覆盖。 <br /><br />2) jar cvf test.jar test <br /><br />该命令与上例中的结果相同，但是由于 v 参数的作用，显示出了打包过程，如下： <br /><br />标明清单(manifest) <br /><br />增加：test/(读入= 0) (写出= 0)(存储了 0%) <br /><br />增加：test/Test.class(读入= 7) (写出= 6)(压缩了 14%) <br /><br />3) jar cvfM test.jar test <br /><br />该命令与 2) 结果类似，但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件，打包过程的信息也略有差别： <br /><br />增加：test/(读入= 0) (写出= 0)(存储了 0%) <br /><br />增加：test/Test.class(读入= 7) (写出= 6)(压缩了 14%) <br /><br />4) jar cvfm test.jar manifest.mf test <br /><br />运行结果与 2) 相似，显示信息也相同，只是生成 JAR 包中的 META-INF/MANIFEST 内容不同，是包含了 manifest.mf 的内容 <br /><br />5) jar tf test.jar <br /><br />在 test.jar 已经存在的情况下，可以查看 test.jar 中的内容，如对于 2) 和 3) 生成的 test.jar 分别应该此命令，结果如下； <br /><br />对于 2) <br /><br />META-INF/ <br /><br />META-INF/MANIFEST.MF <br /><br />test/ <br /><br />test/Test.class <br /><br />对于 3) <br /><br />test/ <br /><br />test/Test.class <br /><br />6) jar tvf test.jar <br /><br />除显示 5) 中显示的内容外，还包括包内文件的详细信息，如： <br /><br />0 Wed Jun 19 15:39:06 GMT 2002 META-INF/ <br /><br />86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF <br /><br />0 Wed Jun 19 15:33:04 GMT 2002 test/ <br /><br />7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class <br /><br />7) jar xf test.jar <br /><br />解开 test.jar 到当前目录，不显示任何信息，对于 2) 生成的 test.jar，解开后的目录结构如下： <br /><br />== <br /><br />|-- META-INF <br /><br />|　 `-- MANIFEST <br /><br />`-- test <br /><br />`--Test.class <br /><br />jar xvf test.jar <br /><br />运行结果与 7) 相同，对于解压过程有详细信息显示，如： <br /><br />创建：META-INF/ <br /><br />展开：META-INF/MANIFEST.MF <br /><br />创建：test/ <br /><br />展开：test/Test.class <br /><br />9) jar uf test.jar manifest.mf <br /><br />在 test.jar 中添加了文件 manifest.mf，此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest。这里顺便提一下，如果使用 -m 参数并指定 manifest.mf 文件，那么 manifest.mf 是作为清单文件 MANIFEST 来使用的，它的内容会被添加到 MANIFEST 中；但是，如果作为一般文件添加到 JAR 文件包中，它跟一般文件无异。 <br /><br />10) jar uvf test.jar manifest.mf <br /><br />与 9) 结果相同，同时有详细信息显示，如： <br /><br />增加：manifest.mf(读入= 17) (写出= 19)(压缩了 -11%) <br /><br />4. 关于 JAR 文件包的一些技巧 <br /><br />1) 使用 unzip 来解压 JAR 文件 <br /><br />在介绍 JAR 文件的时候就已经说过了，JAR 文件实际上就是 ZIP 文件，所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件，如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观，方便。而使用 unzip，则是因为它解压时可以使用 -d 参数指定目标目录。 <br /><br />在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的，因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下，再进行解压，比较麻烦。如果使用 unzip，就不需要这么麻烦了，只需要指定一个 -d 参数即可。如： <br /><br />unzip test.jar -d dest/ <br /><br />2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件 <br /><br />上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件，所以，只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包，再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况，只需要将这个 MANIFEST 按需要修改即可。 <br /><br />3) 使用 jar 命令创建 ZIP 文件 <br /><br />有些 Linux 下提供了 unzip 命令，但没有 zip 命令，所以需要可以对 ZIP 文件进行解压，即不能创建 ZIP 文件。如要创建一个 ZIP 文件，使用带 -M 参数的 jar 命令即可，因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单，那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名，创建的就是一个不折不扣的 ZIP 文件了，如将上一节的第 3) 个例子略作改动： <br /><br />jar cvfM test.zip test</p></span>
<img src ="http://www.blogjava.net/liyong/aggbug/84377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-29 16:55 <a href="http://www.blogjava.net/liyong/articles/84377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的序列化再解</title><link>http://www.blogjava.net/liyong/articles/82879.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 22 Nov 2006 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/82879.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/82879.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/82879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/82879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/82879.html</trackback:ping><description><![CDATA[序列化是把一个对象的状态写入一个字节流的过程，它执行RMI，RMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象方法，对象可以作为参数提供给那个远程方法，发送机序列化该对象并传送它，接收机执行反序列化。 <br />序列化和反序列化的关系图表可形成包含循环引用的顺序图表。这是整个序列化的总体思想。 <br />而Serializable接口属于支持序列化的一个接口，只有一个实现它的对象可以被序列化工具存储和回复，Serializable接口没有定义任何成员，只用来表示一个累可以被序列化，若该类可以序列化，那么它的所有子类都可以。 <br />下面是关于序列化的一个实例： <br /><b>程序名称：SerializationDemo.java <br />程序主题：实现对象的序列化和反序列化 <br />程序说明：该程序由实例化一个MyClass类的对象开始，该对象有三个实例变量，类型分别为String、int、double，是希望存储和恢复的信息。</b><br /><br /><pre><br /><br />import java.io.*;
<br /><br />public class SerializationDemo{
<br />        public static void main(String args[]){
<br /><br />//Object serialization
<br />try{
<br />	MyClass object1=new MyClass("Hello",-7,2.7e10);
<br />	System.out.println("object1:"+object1);
<br />	FileOutputStream fos=new FileOutputStream("serial");
<br />	ObjectOutputStream oos=new ObjectOutputStream(fos);
<br />	oos.writeObject(object1);
<br />	oos.flush();
<br />	oos.close();
<br />	}
<br />catch(Exception e){
<br />	System.out.println("Exception during serialization:"+e);
<br />	System.exit(0);
<br />	}
<br /><br />//Object deserialization
<br />try{
<br />	MyClass object2;
<br />	FileInputStream fis=new FileInputStream("serial");
<br />	ObjectInputStream ois=new ObjectInputStream(fis);
<br />	object2=(MyClass)ois.readObject();
<br />	ois.close();
<br />	System.out.println("object2:"+object2);
<br />	}
<br />catch(Exception e){
<br />	System.out.println("Exception during deserialization:"+e);
<br />	System.exit(0);
<br />	}
<br />}
<br />}
<br /><br />class MyClass implements Serializable{
<br />	String s;
<br />	int i;
<br />	double d;
<br />	public MyClass(String s,int i,double d){
<br />		this.s=s;
<br />		this.i=i;
<br />		this.d=d;
<br />	}
<br />	public String toString(){
<br />		return "s="+s+";i="+i+";d="+d;
<br />	}
<br />}
<br /></pre><br /><br />程序运行结果：object1和object2的实例变量是一样的，输出如下：<pre>object1:s=Hello;i=-7;d=2.7E10
<br />object2:s=Hello;i=-7;d=2.7E10</pre><img src ="http://www.blogjava.net/liyong/aggbug/82879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-22 20:16 <a href="http://www.blogjava.net/liyong/articles/82879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE中的序列化详解</title><link>http://www.blogjava.net/liyong/articles/82876.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 22 Nov 2006 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/82876.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/82876.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/82876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/82876.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/82876.html</trackback:ping><description><![CDATA[
		<span class="top11" twffan="done">Java中处处体现着简单的程序设计风格，序列化作为最常用的功能之一，在java中的设计尤为“简单”。在ObjectInputStream 和ObjectOutputStream的帮助下，我们可以轻松的实现序列化。 <br /><br />只要我们的class 实现了java.io.Serializable接口，就可以利用ObjectOutputStream的writeObject（）方法将一个对象序列化；利用ObjectInputStream的readObject()方法，可以返回读出的object对象。Serializable接口不需要我们实现任何方法。<br /><br />以下是一个例子，它能给我们一个感性的初步认识：<br /><br />Serial实现了就java.io.Serializable接口，是需要序列化的类。我们首先构造一个Serial的对象serial1然后将其保存(序列化)在一个文件中，而后再将其读出（反序列化），并打印其内容。<br /><pre>package Stream;<br /><br />/**<br /><br />* @author favo yang<br /><br />*/<br /><br />import java.io.*;<br /><br />public class Serial implements Serializable {<br /><br />　int company_id;<br /><br />　String company_addr;<br /><br />　boolean company_flag;<br /><br />　public Serial(){}//不同于C++,没有也可以<br /><br />　public Serial(int company_id,String company_addr,boolean company_flag) {<br /><br />this.company_id=company_id;<br /><br />this.company_addr=company_addr;<br /><br />this.company_flag=company_flag;<br /><br />　}<br /><br />　public static void main(String[] args) {<br /><br />Serial serial1 = new Serial(752,"dayer street #5 building 02-287",false);//构造一个新的对象<br /><br />FileInputStream in=null;<br /><br />FileOutputStream out=null;<br /><br />ObjectInputStream oin=null;<br /><br />ObjectOutputStream oout=null;<br /><br />try {<br /><br />　out = new FileOutputStream("5.txt");<br /><br />　oout = new ObjectOutputStream(out);<br /><br />　serial1.serialize(oout);//序列化<br /><br />　oout.close();<br /><br />　oout=null;<br /><br />　in = new FileInputStream("5.txt");<br /><br />　oin = new ObjectInputStream(in);<br /><br />　Serial serial2 = Serial.deserialize(oin);//反序列化<br /><br />　System.out.println(serial2);//打印结果<br /><br />} catch (Exception ex){<br /><br />　ex.printStackTrace();<br /><br />} finally{<br /><br />　try {<br /><br />if (in != null) {<br /><br />　in.close();<br /><br />}<br /><br />if (oin != null) {<br /><br />　oin.close();<br /><br />}<br /><br />if (out != null) {<br /><br />　out.close();<br /><br />}<br /><br />if (oout != null) {<br /><br />　oout.close();<br /><br />}<br /><br />　} catch (IOException ex1) {<br /><br />ex1.printStackTrace();<br /><br />　}<br /><br />}<br /><br />　}<br /><br />　/**<br /><br />　* deserialize<br /><br />　*/<br /><br />　public static Serial deserialize(ObjectInputStream oin) throws Exception{<br /><br />Serial s=(Serial)oin.readObject();<br /><br />return s;<br /><br />　}<br /><br />　public String toString() {<br /><br />return "DATA: "+company_id+" "+company_addr+" "+company_flag;<br /><br />　}<br /><br />　/**<br /><br />* serialize<br /><br />　*/<br /><br />　public void serialize(ObjectOutputStream oout) throws Exception{<br /><br />oout.writeObject(this);<br /><br />　}<br /><br />}<br /><br />运行结果：DATA: 752 dayer street #5 building 02-287 false<br /><br />正确打印了结果。<br /></pre></span>
<img src ="http://www.blogjava.net/liyong/aggbug/82876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-22 20:00 <a href="http://www.blogjava.net/liyong/articles/82876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK 1.5引入的新特性 -- 泛型 </title><link>http://www.blogjava.net/liyong/articles/82292.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Mon, 20 Nov 2006 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/82292.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/82292.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/82292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/82292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/82292.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#ff0000">
						<strong>1. 引言</strong>
				</font>
		</p>
		<p>JDK 1.5 中引入了新的语言成分, 泛型(Generics)是其中较为重要的一个.<br />简单的泛型(Defining Simple Generics)</p>
		<p>以下代码摘自java.util包的List接口和Iterator接口的定义:</p>
		<p>
				<font style="BACKGROUND-COLOR: #deb887" face="Courier New">public interface List&lt;E&gt; {<br />  void add(E x);<br />  Iterator&lt;E&gt; iterator();<br />}<br />public interface Iterator&lt;E&gt; {<br />  E next();<br />  boolean hasNext();<br />}</font>
		</p>
		<p>
				<font color="#0000ff">类型参数</font>
		</p>
		<p>与尖括号有关的一些东西是JDK 5引入的新东西, 它们是List和Iterator接口的"形式的类型参数"(简称"类型形参")声明.<br />而在对泛型声明List进行调用时(例如: List&lt;Integer&gt;), 所有出现的类型形参(如 <br />E)的地方, 都会被"实际的类型参数"(简称"类型实参", 如 Integer)所替换掉.</p>
		<p>虽然与C++中的模板机制在形式上很想像, 但必需注意, Java中的泛型声明决不会在调用时被展成多份副本: 不论是在源码级, 二进制级, 还是在磁盘或内存中, 都不会被展开!</p>
		<p>泛型声明只会也只需编译一次, 并生成一个类文件(class文件), 这一点跟普通的类或接口完全一样.</p>
		<p>类型参数其实跟方法或构造器中所用的通常参数相类似. 一个方法中可以声明它用以处理的"形式的值参数", 相似地, 泛型声明也有其"形式的类型参数"; 当方法被调用时, 实际参数会替换形式参数, 然后执行方法体, 同样, 当泛型声明被调用时, 实际的类型参数会替换掉形式的类型参数.</p>
		<p>关于命名约定的备注: 推荐使用精炼而简明(如, 单个字符)的方式为形式的类型参数命名. 最好避免使用小写字符, 以便与普通的类或接口的参数相区分开来. 许多宣传品类型使用 E 表示其元素的类型形参.</p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">2. 泛类型与子类型化(Generics and Subtyping)</font>
				</strong>
		</p>
		<p>先看以下两行代码是否合法:<br /><font style="BACKGROUND-COLOR: #deb887" face="Courier New">List&lt;String&gt; ls = new ArrayList&lt;String&gt;(); // 1<br />List&lt;Object&gt; lo = ls; // 2<br /></font>第一行没问题, 关键在第二行代码, 大多数人会认为, "一个String的List自然更是一个Object的List", 因此, 第2行没问题.</p>
		<p>好, 接着看以下代码:<br /><font style="BACKGROUND-COLOR: #deb887" face="Courier New">lo.add(new Object()); // 3<br />String s = ls.get(0); // 4: 试图将一个Object赋给一个String!<br /><br /></font>可见, 通过别名lo, 我们能对ls, 一个String的列表, 进行数据操作(特别是插入一个Object), 从而导致ls不仅仅是容纳了String对象! 这是Java编译器不容许的! 编译时, 第2行会报告一个编译错误的.</p>
		<p>通常, 若Foo是Bar的一个子类型(子类或子接口), G是某个泛型声明, 则G&lt;Foo&gt;并不是G&lt;Bar&gt;的一个子类型. </p>
		<p>这一点往往是最难以理解的, 因为它和通常的直观相左. 在直观的理解中, 我们实际上假定了集合是不会变动的, 但java语言中则非如此.</p>
		<p>
				<br />
				<strong>
						<font color="#ff0000">3. 通配(Wildcards)</font>
				</strong>
		</p>
		<p>假定要输出一个集合中的所有元素. 以下分别是旧版本及新版本(JDK 1.5)中的写法:</p>
		<p>
				<font style="BACKGROUND-COLOR: #deb887" face="Courier New">void printCollection(Collection c) {<br />  Iterator i = c.iterator();<br />  for( k = 0; k &lt; c.size(); k++) {<br />    System.out.println( i.next() );<br />}}</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #deb887" face="Courier New">void printCollection(Collection&lt;Object&gt; c) {<br />  for(Object e : c) {<br />    System.out.println(e);<br />}}</font>
		</p>
		<p>问题在于, 新版本反而不如旧版本更有用些. 因为旧版本能使用各种类型的集合作为参数, 但新版本则只能使用Collection&lt;Object&gt;. 而正如上节看到的, Collection&lt;Object&gt;并不是其它各种集合的超类型(父类型).</p>
		<p>所有集合的超类型应该写作: Collection&lt;?&gt;, 读作: collection of unknown(未知集合), 即一个集合, 其元素类型可以与任何类型相匹配. 因此称这种类型为"通配类型".</p>
		<p>正确实现上述旧版本的代码可以这么写:<br /><font style="BACKGROUND-COLOR: #deb887" face="Courier New">void printCollection(Collection&lt;?&gt; c) {<br />  for(Object e : c) {<br />    System.out.println(e);<br />}}</font></p>
		<p>这时, 可以用任意类型的集合来调用此方法. 注意在方法体中, 仍然从 c 中读入元素并赋给了Object, 这是没有错误的, 因此不论类型实参是何种集合, 它的元素都是object. 然而, 如果任意给它增加一个object则是不安全的:</p>
		<p>
				<font style="BACKGROUND-COLOR: #deb887" face="Courier New">Collection&lt;?&gt; c = new ArrayList&lt;String&gt;();<br />c.add(new Object()); // 编译时的错误</font>
		</p>
		<p>由于我们不知道c的元素类型是什么, 所以不能给它增加一个object. 方法add()接受一个类型E的参数, 而E与集合的元素类型相同. 当类型实参是?时, 它表示"未知的类型", 我们传递给add的参数必须是这个"未知类型"的子类型. 不幸的是, 既然类型未知, 也就无法决定其子类型, 于是什么也不能作为其参数. 唯一的例外是null, 因为null是所有类型的一个成员.</p>
		<p>另一方面, 如果给了一个List&lt;?&gt;, 我们可以调用get()方法并使用其返回的元素. 虽然返回的元素类型是"未知类型", 但它总归是一个object, 因此将get()返回的元素赋给一个Object类型的变量, 或将其传递给一个可接受Object的参数都是安全的.</p>
<img src ="http://www.blogjava.net/liyong/aggbug/82292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-20 15:44 <a href="http://www.blogjava.net/liyong/articles/82292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入HashCode方法</title><link>http://www.blogjava.net/liyong/articles/81904.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Sat, 18 Nov 2006 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81904.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81904.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81904.html</trackback:ping><description><![CDATA[
		<p>为什么HashCode对于对象是如此的重要?<img height="20" src="http://www.blogjava.net/Emoticons/QQ/icon18.gif" width="25" border="0" /></p>
		<p>　　一个对象的HashCode就是一个简单的Hash算法的实现，虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法，它如何实现它，不仅仅是程序员的编程水平问题，而是关系到你的对象在存取是性能的非常重要的关系.有可能，不同的HashCode可能会使你的对象存取产生，成百上千倍的性能差别。</p>
		<p>　　我们先来看一下，在JAVA中两个重要的数据结构:HashMap和Hashtable，虽然它们有很大的区别，如继承关系不同，对value的约束条件(是否允许null)不同，以及线程安全性等有着特定的区别，但从实现原理上来说，它们是一致的.所以，我们只以Hashtable来说明:</p>
		<p>　　在java中，存取数据的性能，一般来说当然是首推数组，但是在数据量稍大的容器选择中，Hashtable将有比数组性能更高的查询速度.具体原因看下面的内容。</p>
		<p>　　Hashtable在存储数据时，一般先将作为key的对象的HashCode和0x7FFFFFFF做与操作，因为一个对象的HashCode可以为负数，这样操作后可以保证它为一个正整数.然后以Hashtable的长度取模，得到值对象在Hashtable中的索引。</p>
		<p>　　index = (o.hashCode() &amp; 0x7FFFFFFF)%hs.length;这个值对象就会直接放在Hashtable的第index位置，对于写入，这和数组一样，把一个对象放在其中的第index位置，但如果是查询，经过同样的算法，Hashtable可以直接通过key得到index，从第index取得这个值对象，而数组却要做循环比较.所以对于数据量稍大时，Hashtable的查询比数据具有更高的性能。</p>
		<p>　　虽然不同对象有不同的hashcode，但不同的hashCode经过与长度的取余，就很可能产生相同的index。</p>
		<p>　　极端情况下会有大量的对象产生一个相同的索引.这就是关系Hashtable性能问题的最重要的问题:</p>
		<p>　　Hash冲突。</p>
		<p>　　常见的Hash冲突是不同key对象最终产生了相同的索引，而一种非常甚至绝对少见的Hash冲突是，如果一组对象的个数大过了int范围，而HashCode的长度只能在int范围中，所以肯定要有同一组的元素有相同的HashCode，这样无论如何他们都会有相同的索引.当然这种极端的情况是极少见的，可以暂不考虑，但是对于同的HashCode经过取模，则会产中相同的索引，或者不同的对象却具有相同的HashCode，当然具有相同的索引。</p>
		<p>　　事实上一个设计各好的HashTable，一般来说会比较平均地分布每个元素，因为Hashtable的长度总是比实际元素的个数按一定比例进行自增(装填因子一般为0.75)左右，这样大多数的索引位置只有一个对象，而很少的位置会有几个元素.所以Hashtable中的每个位置存放的是一个链表，对于只有一个对象是位置，链表只有一个首节点(Entry)，Entry的next为null.然后有hashCode，key，value属性保存了该位置的对象的HashCode，key和value(对象本身)，如果有相同索引的对象进来则会进入链表的下一个节点.如果同一个索引中有多个对象，根据HashCode和key可以在该链表中找到一个和查询的key相匹配的对象。</p>
		<p>　　从上面我看可以看到，对于HashMap和Hashtable的存取性能有重大影响的首先是应该使该数据结构中的元素尽量大可能具有不同的HashCode，虽然这并不能保证不同的HashCode产生不同的index，但相同的HashCode一定产生相同的index，从而影响产生Hash冲突。</p>
		<p>　　对于一个象，如果具有很多属性，把所有属性都参与散列，显然是一种笨拙的设计.因为对象的HashCode()方法几乎无所不在地被自动调用，如equals比较，如果太多的对象参与了散列.那么需要的操作常数时间将会增加很大.所以，挑选哪些属性参与散列绝对是一个编程水平的问题。</p>
		<p>　　从实现来说，一般的HashCode方法会这样:</p>
		<p>　　return Attribute1.HashCode() + Attribute1.HashCode()..[+super.HashCode()]。</p>
		<p>　　我们知道，每次调用这个方法，都要重新对方法内的参与散列的对象重新计算一次它们的HashCode的运算，如果一个对象的属性没有改变，仍然要每次都进行计算，所以如果设置一个标记来缓存当前的散列码，只要当参与散列的对象改变时才重新计算，否则调用缓存的hashCode，这可以从很大程度上提高性能。</p>
		<p>　　默认的实现是将对象内部地址转化为整数作为HashCode，这当然能保证每个对象具有不同的HasCode，因为不同的对象内部地址肯定不同(废话)，但java语言并不能让程序员获取对象内部地址，所以，让每个对象产生不同的HashCode有着很多可研究的技术。</p>
		<p>　　如果从多个属性中采样出能具有平均分布的hashCode的属性，这是一个性能和多样性相矛盾的地方，如果所有属性都参与散列，当然hashCode的多样性将大大提高，但牺牲了性能，而如果只能少量的属性采样散列，极端情况会产生大量的散列冲突，如对"人"的属性中，如果用性别而不是姓名或出生日期，那将只有两个或几个可选的hashcode值，将产生一半以上的散列冲突.所以如果可能的条件下，专门产生一个序列用来生成HashCode将是一个好的选择(当然产生序列的性能要比所有属性参与散列的性能高的情况下才行，否则还不如直接用所有属性散列)。</p>
		<p>　　如何对HashCode的性能和多样性求得一个平衡，可以参考相关算法设计的书，其实并不一定要求非常的优秀，只要能尽最大可能减少散列值的聚集.重要的是我们应该记得HashCode对于我们的程序性能有着生要的影响，在程序设计时应该时时加以注意。</p>
<img src ="http://www.blogjava.net/liyong/aggbug/81904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-18 10:28 <a href="http://www.blogjava.net/liyong/articles/81904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何正确地应用Runtime类调用程序</title><link>http://www.blogjava.net/liyong/articles/81385.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 15 Nov 2006 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81385.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81385.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81385.html</trackback:ping><description><![CDATA[
		<p align="left">                                         如何正确地应用Runtime类调用程序<br />用Java编写应用时，有时需要在程序中调用另一个现成的可执行程序或系统命令，这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式： <br />... <br />Process process = Runtime.getRuntime().exec(.\\p.exe); <br />process.waitfor( ); <br />... <br />在上面的程序中，第一行的“.\\p.exe”是要执行的程序名，Runtime.getRuntime()返回当前应用程序的Runtime对象，该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序，并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。 <br />但在windows平台上，如果处理不当，有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况： <br />1、执行DOS的内部命令 <br />如果要执行一条DOS内部命令，有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如，执行dir命令，在NT上， 可写成exec(cmd.exe /c dir)，在windows 95/98下，可写成“command.exe /c dir”，其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。另一种方法是，把内部命令放在一个批命令my_dir.bat文件中，在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec(dir)，Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性，需要在程序中读取运行的操作系统平台，以调用不同的命令解释器。后一种方法则不需要做更多的处理。 <br />2、打开一个不可执行的文件 <br />打开一个不可执行的文件，但该文件存在关联的应用程序，则可以有两种方式。 以打开一个word文档a.doc文件为例，Java中可以有以下两种写法： <br />exec("start .\\a.doc"); <br />exec(" c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc"); <br />显然，前一种方法更为简捷方便。 <br />3、执行一个有标准输出的DOS可执行程序 <br />在windows平台上，运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭，从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是，该可执行程序的标准输出比较多，而运行窗口的标准输出缓冲区不够大。解决的办法是，利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出，在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下： <br />... <br />String ls_1; <br />Process process = Runtime.getRuntime().exec("cmd /c dir"); <br />BufferedReader bufferedReader = new BufferedReader( \\ <br />new InputStreamReader(process.getInputStream()); <br />while ( (ls_1=bufferedReader.readLine()) != null) <br />System.out.println(ls_1); <br /> <br />process.waitfor( );<font color="#cc0000">(</font></p>
<img src ="http://www.blogjava.net/liyong/aggbug/81385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-15 21:48 <a href="http://www.blogjava.net/liyong/articles/81385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA反射机制使用注意事项</title><link>http://www.blogjava.net/liyong/articles/81383.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 15 Nov 2006 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81383.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81383.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81383.html</trackback:ping><description><![CDATA[
		<strong>在应用java的反射机制时，要注意：<img height="19" src="http://www.blogjava.net/Emoticons/coffee.gif" width="19" border="0" /><br /><br />1)java.lang.reflect;<br /><br />2)要用Field类获得某个Class 中的私有或受保护的字段时，必须调用  cl.getDeclaredField();<br /><br />3)Field,Method,Constructor都是Accessible类的子类，都可以直接在前者中的  任一个类中调用setAccessible(boolean);即对Field的一个实例对象设置权限  ，能访问到当前字段的值！<br /> Employee harry = new Employee("Harry Hacker",3500,new Date(10,1,1989));<br /> Class cl = harry.getClass();<br /> Field f = cl.getDeclaredField("name");//如果字段name是public，用getField也可行！<br /> f.setAccessible(true);//更改访问权限！<br /> Object v = f.get(harry);</strong>
<img src ="http://www.blogjava.net/liyong/aggbug/81383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-15 21:36 <a href="http://www.blogjava.net/liyong/articles/81383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用DOS命令</title><link>http://www.blogjava.net/liyong/articles/81381.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 15 Nov 2006 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81381.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81381.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81381.html</trackback:ping><description><![CDATA[
		<h1 align="center">
				<font color="#57c43c">常用DOS命令</font>
		</h1>
		<p>
				<font color="#000000">dir 列文件名       deltree 删除目录树        cls 清屏           cd 改变当前目录<br />copy 拷贝文件      diskcopy 复制磁盘         del 删除文件       format 格式化磁盘<br />edit 文本编辑      mem 查看内存状况          md 建立子目录      move 移动文件、改目录名<br />more 分屏显示      type 显示文件内容         rd 删除目录        sys 制作DOS系统盘<br />ren 改变文件名     xcopy 拷贝目录与文件      chkdsk 检查磁盘    attrib 设置文件属性<br />fdisk 硬盘分区     date 显示及修改号期       label 设置卷标号   defrag 磁盘碎片整理<br />msd 系统检测       path 设置搜寻目录         share 文件共享     memmaker内存优化管理<br />help 帮助          restore 恢复备份文件      set 设置环境变量   time 显示及修改时间<br />tree 列目录树      debug 随机调试程序        doskey 重新调用DOS命令                                                                                                                                            prempt 设置提示符  undelete恢复被删的文件    scandisk检测、修理磁盘         <br />     <br />不常用DOS命令<br />diskcomp磁盘比较　             append 设置非执行文件路径<br />expand 还原DOS文件             fasthelp快速显示帮助信息  <br />fc 文件比较                    interink启动服务器 <br />setver 设置版本                intersvr启动客户机  <br />subst 路径替换                 qbasic Basic集成环境<br />vsafe 防病毒                   unformat恢复已格式化的磁盘  <br />ver 显示DOS版本号              smartdrv设置磁盘加速器<br />vol 显示磁盘卷标号             lh 将程序装入高端内存     <br />ctty 改变控制设备              emm386 扩展内存管理<br />   常用命令具体介绍:    <br /><br />一、Dir <br /><br />显示目录文件和子目录列表，呵呵，这个当然是人人要知道的。 <br />可以使用通配符（? 和 *），？表通配一个字符，*表通配任意字符 <br />*.后缀 <br />指定要查看后缀的文件。 上面其实也可以为“ . 后缀”,例如dir *.exe 等于dir .exe <br />/p <br />每次显示一个列表屏幕。要查看下一屏，请按键盘上的任意键。 <br />/w <br />以宽格式显示列表，在每一行上最多显示 5 个文件名或目录名。 <br />/s <br />列出指定目录及所有子目录中出现的每个指定的文件名。比win环境下的查找快多了 <br />dir *.* -&gt; a.txt 把当前目录文件列表写入a.txt <br />dir *.* /s -&gt; a.txt 把当前目录文件列表写入a.txt，包括子目录下文件。 <br /><br />二、Attrib <br /><br />显示、设置或删除指派给文件或目录的只读、存档、系统以及隐藏属性。如果在不含参数的情况下使用，则 attrib 会显示当前目录中所有文件的属性。 <br />+r <br />设置只读属性。 <br />-r <br />清除只读属性。 <br />+a <br />设置存档文件属性。 <br />-a <br />清除存档文件属性。 <br />+s <br />设置系统属性。 <br />-s <br />清除系统属性。 <br />+h <br />设置隐藏属性。 <br />-h <br />清除隐藏属性。 <br />三、Cls <br /><br />清除显示在命令提示符窗口中的所有信息，并返回空窗口，即“清屏” <br /><br />四、Exit <br />退出当前命令解释程序并返回到系统。 <br /><br />五、format <br />格式化 <br />/q <br />执行快速格式化。删除以前已格式化卷的文件表和根目录，但不在扇区之间扫描损坏区域。使用 /q 命令行选项应该仅格式化以前已格式化的完好的卷。 <br /><br />六、Ipconfig <br />显示所有当前的 TCP/IP 网络配置值、刷新动态主机配置协议 (DHCP) 和域名系统 (DNS) 设置。使用不带参数的 ipconfig 可以显示所有适配器的 IP 地址、子网掩码、默认网关。 <br />/all <br />显示所有适配器的完整 TCP/IP 配置信息。 <br />ipconfig 等价于 winipcfg，后者在ME、98 和 95 上可用。尽管 Windows XP 没有提供象 winipcfg 命令一样的图形化界面，但可以使用“网络连接”查看和更新 IP 地址。要做到这一点，请打开 网络连接，右键单击某一网络连接，单击“状态”，然后单击“支持”选项卡。 <br />该命令最适用于配置为自动获取 IP 地址的计算机。它使用户可以确定哪些 TCP/IP 配置值是由 DHCP、自动专用 IP 地址 (APIPA) 和其他配置配置的。 <br /><br />七、md <br />创建目录或子目录 <br /><br />八、Move <br />将一个或多个文件从一个目录移动到指定的目录。 <br /><br />九、Nbtstat <br />显示本地计算机和远程计算机的基于 TCP/IP (NetBT) 协议的 NetBIOS 统计资料、NetBIOS 名称表和 NetBIOS 名称缓存。Nbtstat 可以刷新 NetBIOS 名称缓存和注册的 Windows Internet 名称服务 (WINS) 名称。使用不带参数的 nbtstat 显示帮助。Nbtstat 命令行参数区分大小写。 <br />-a remotename <br />显示远程计算机的 NetBIOS 名称表，其中，RemoteName 是远程计算机的 NetBIOS 计算机名称。 <br />-A IPAddress <br />显示远程计算机的 NetBIOS 名称表，其名称由远程计算机的 IP 地址指定（以小数点分隔）。 <br /><br />十、Netstat <br />显示活动的 TCP 连接、计算机侦听的端口、以太网统计信息、IP 路由表、IPv4 统计信息（对于 IP、ICMP、TCP 和 UDP 协议）以及 IPv6 统计信息（对于 IPv6、ICMPv6、通过 IPv6 的 TCP 以及通过 IPv6 的 UDP 协议）。使用时如果不带参数，netstat 显示活动的 TCP 连接。 <br />-a <br />显示所有活动的 TCP 连接以及计算机侦听的 TCP 和 UDP 端口。 <br />十一、Ping <br />通过发送“网际消息控制协议 (ICMP)”回响请求消息来验证与另一台 TCP/IP 计算机的 IP 级连接。回响应答消息的接收情</font>
		</p>
		<p>
				<font color="#000000">况将和往返过程的次数一起显示出来。Ping 是用于检测网络连接性、可到达性和名称解析的疑难问题的主要 TCP/IP 命令。如果不带参数，ping 将显示帮助。名称和Ip地址解析是它的最简单应用也是用的最多的。 <br />-t <br />指定在中断前 ping 可以持续发送回响请求信息到目的地。要中断并显示统计信息，请按 CTRL-BREAK。要中断并退出 ping，请按 CTRL-C。 <br />-lSize <br />指定发送的回响请求消息中“数据”字段的长度（以字节表示）。默认值为 32。size 的最大值是 65,527。 <br /><br />十二、Rename (Ren) <br />更改文件的名称。 <br />例如 ren *.abc *.cba <br /><br />十三、Set <br />显示、设置或删除环境变量。如果没有任何参数，set 命令将显示当前环境设置。 <br /><br />十四、Shutdown <br />允许您关闭或重新启动本地或远程计算机。如果没有使用参数，shutdown 将注销当前用户。 <br />-m ComputerName <br />指定要关闭的计算机。 <br />-t xx <br />将用于系统关闭的定时器设置为 xx 秒。默认值是 20 秒。 <br />-l <br />注销当前用户，这是默认设置。-m ComputerName 优先。 <br />-s <br />关闭本地计算机。 <br />-r <br />关闭之后重新启动。 <br />-a <br />中止关闭。除了 -l 和 ComputerName 外，系统将忽略其它参数。在超时期间，您只可以使用 -a。 <br /><br />十五、System File Checker (sfc) <br />win下才有，在重新启动计算机后扫描和验证所有受保护的系统文件。 <br />/scannow <br />立即扫描所有受保护的系统文件。 <br />/scanonce <br />一次扫描所有受保护的系统文件。 <br />/purgecache <br />立即清除“Windows 文件保护”文件高速缓存，并扫描所有受保护的系统文件。 <br />/cachesize=x <br />设置“Windows 文件保护”文件高速缓存的大小，以 MB 为单位。 <br /><br />十六、type <br />显示文本文件的内容。使用 type 命令查看文本文件或者是bat文件而不修改文件 <br /><br />十七、Tree <br />图像化显示路径或驱动器中磁盘的目录结构。 <br /><br />十八、Xcopy <br />复制文件和目录，包括子目录。 <br />/s <br />复制非空的目录和子目录。如果省略 /s，xcopy 将在一个目录中工作。 <br />/e <br />复制所有子目录，包括空目录。 <br /><br />十九、copy <br />将一个或多个文件从一个位置复制到其他位置 <br /><br />二十、del <br />删除指定文件。 <br />ftp和bat批命令和net和telnet由于子命令太多，这里不说了，不过这几个都是常用到的。</font>
		</p>
<img src ="http://www.blogjava.net/liyong/aggbug/81381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-15 21:33 <a href="http://www.blogjava.net/liyong/articles/81381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对dos中无新建文件命令的解决</title><link>http://www.blogjava.net/liyong/articles/81379.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 15 Nov 2006 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81379.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81379.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81379.html</trackback:ping><description><![CDATA[
		<p>
				<img height="19" src="http://www.blogjava.net/Emoticons/74_74.gif" width="19" border="0" />
				<br />
				<br />
				<br />1 .  copy con\n<br />     输入内容 (ctrl-z或F6) \n</p>
		<p>
				<br />2 . echo content &gt; fileName</p>
<img src ="http://www.blogjava.net/liyong/aggbug/81379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-15 21:31 <a href="http://www.blogjava.net/liyong/articles/81379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOS命令大全</title><link>http://www.blogjava.net/liyong/articles/81376.html</link><dc:creator>Timothy</dc:creator><author>Timothy</author><pubDate>Wed, 15 Nov 2006 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/liyong/articles/81376.html</guid><wfw:comment>http://www.blogjava.net/liyong/comments/81376.html</wfw:comment><comments>http://www.blogjava.net/liyong/articles/81376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liyong/comments/commentRss/81376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liyong/services/trackbacks/81376.html</trackback:ping><description><![CDATA[ATTRIB 文件属性（显示或改变属性） <br />CHDIR(CD) 改变目录 <br />CHKDSK 检查磁盘 <br />CHOICE 提示击键输入 <br />CLS 清屏幕 <br />COMMAND 重新加载MS-DOS程序 <br />COPY 复制文件  <br />DATE 设置显示日期 <br />DEBUG 调试程序 <br />DEFRAG 清除磁盘碎片 <br />DEL(ERASE) 删除文件 <br />DELOLDOS 删除旧DOS文件 <br />DELTREE 删除目录树分支 <br />DIR 显示目录  <br />DISKCOMP 比较软盘内容 <br />DISKCOPY 复制磁盘 <br />DOS 扩展扩充内存管理 <br />DOSSHELL DOS外层 <br />DRIVPARM 定义驱动器参数 <br />EDIT 编辑器 <br />EMM386 内存管理 <br />ERASE 删除文件 <br />DBLSPACE 磁盘压缩 <br />EXPAND 释放压缩 <br />FASTHELP 快速求助 <br />FC 文件比较 <br />FDISK 磁盘分区 <br />FIND 搜寻指定字串 <br />FOR 循环执行命令 <br />FORMAT 格式化磁盘 <br />MEM 内存使用情况显示 <br />MKDIR(MD) 建立子目录 <br />MSAV 检查和清除病毒 <br />MSBACKUP 磁盘文件务份 <br />PATH 设置搜索路径 <br />PAUSE 暂停执行命令 <br />RESTORE 磁盘文件转储 <br />RENAME(REN) 文件重新命名 <br />RMDIR(RD) 删除目录 <br />SCANDISK 检查磁盘 <br />SYS 传送系统文件 <br />TIME 设置显示时间 <br />TREE 显示目录结构 <br />TYPE 显示文件内容 <br />UNDELETE 恢复被删除文件 <br />VER 显示系统版本号 <br />VOL 显示卷标 <br />VSAFE 病毒检查 <br />XCOPY 复制组文件 <br />APPEND 补充路径 <br />BREAK 检查控制中断 <br />BUFFERS 设置磁盘缓冲区数 <br />CALL 调用批文件 <br />CHCP 转换码页 <br />COUNTRY 确定国家标准货币 <br />CTTY 改变控制台 <br />DEVICE 安装设备驱动程序 <br />DEVICEHIGH 装载设备驱动程序 <br />ECHO 命令显示开关 <br />FASTOPEN 快速加载文件 <br />FCBS 使用文件控制块 <br />FILES 同时打开文件数 <br />GOTO 转向分支 <br />GRAPHICS 图形屏幕打印 <br />HELP 求助 <br />IF 设定条件 <br />INCLUDE 简化多重配置块 <br />INSTALL 安装常驻程序 <br />INTERLNK 计算机互连 <br />INTERSVR 与服务器互连 <br />KEYB 装载字符转换表 <br />LABEL 卷标  <br />LASTDRIVE 置最大驱动器数 <br />LOADFIX 装入固定内存 <br />LOADHIGH(LH) 高内存程序装载 <br />MEMMAKER 检查内存 <br />MENUCOLOR 设置显示选项 <br />MODE 设置硬件工作方式 <br />MSCDEX 访问CD驱动器 <br />MSO 检查系统配置 <br />NLSFUNC 支持各国语言 <br />NUMLOCK 控制NUMLOCK键 <br />POWER 节省电能 <br />PRINT 后台打印 <br />PROMPT 改变系统提示 <br />QBASIC 启动QB <br />REM 注释信息 <br />REPLACE 替换文件 <br />SET 设置环境变量 <br />SETUP 安装DOS6。2文件 <br />SETVER 改变DOS版本表 <br />SHARE 网络文件共享 <br />SHELL 装载命令处理程序 <br />SMARTDRV 磁盘缓冲 <br />SORT 文件排序 <br />STACKS 支持动态使用的数据线 <br />SUBMENU 菜单项（配置CONFIG。SYS） <br />SUBST 设置虚拟驱动器 <br />SWITCHES 键盘开关 <br />VRIFY 磁盘检验<img src ="http://www.blogjava.net/liyong/aggbug/81376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liyong/" target="_blank">Timothy</a> 2006-11-15 21:23 <a href="http://www.blogjava.net/liyong/articles/81376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>