搜档网
当前位置:搜档网 › JAVA类路径说明(新手必读)

JAVA类路径说明(新手必读)

JAVA类路径说明(新手必读)
JAVA类路径说明(新手必读)

一、类路径 (class path)

当你满怀着希望安装好java,然后兴冲冲地写了个“hello world”,然后编译,运行,就等着那两个美好的单词出现在眼前。可是不幸的是,只看到了“Can't find class HelloWorld”或者“Exception in thread "main" https://www.sodocs.net/doc/d66993637.html,ng.NoSuchMethodError: main。

为什么呢?编译好的class明明在呀。

我们一起来看一看java程序的运行过程。我们已经知道java是通过java虚拟机来解释运行的,也就是通过java命令—javac编译生成的.class文件就是虚拟机要执行的代码,称之为字节码(bytecode),虚拟机通过classloader来装载这些字节码,也就是通常意义上的类。这里就有一个问题,classloader从哪里知道java本身的类库及用户自己的类在什

么地方呢?或者有着缺省值(当前路径) ,或者要有一个用户指定的变量来表明,这个变量就是类路径(classpath),或者在运行的时候传参数给虚拟机。这也就是指明classpath的三个方法。编译的过程和运行的过程大同小异,只是一个是找出来编译,另一个是找出来装载。实际上java虚拟机是由java luncher初始化的,也就是java (或java.exe) 这个程序来做的。虚拟机按以下顺序搜索并装载所有需要的类:

1、引导类:组成java平台的类,包含rt.jar和i18n.jar中的类。

2、扩展类:使用java扩展机制的类,都是位于扩展目录($JAVA_HOME/jre/lib/ext) 中的.jar档案包。

3、用户类:开发者定义的类或者没有使用java扩展机制的第三方产品。你必须在命令行中使用-classpath选项或者使用CLASSPATH环境变量来确定这些类的位置。

我们在上面所说的用户自己的类就是特指这些类。

这样,一般来说,用户只需指定用户类的位置,引导类和扩展类是“自动”寻找的。那么到底该怎么做呢?用户类路径就是一些包含类文件的目录,.jar, .zip文件的列表,至于类具体怎么找,因为牵扯到package的问题,下面将会说到,暂时可认为只要包含了这个类就算找到了这个类。根据平台的不同分隔符略有不同,类unix的系统基本上都是“:”,windows多是“;”。其可能的来源是:

* “. ”,即当前目录,这个是缺省值。

* CLASSPATH环境变量,一旦设置,将缺省值覆盖。

* 命令行参数-cp或者-classpath,一旦指定,将上两者覆盖。

* 由-jar参数指定的.jar档案包,就把所有其他的值覆盖,所有的类都来自这个指定的档案包中。由于生成可执行的.jar文件,还需要其他一些知识,比如package,还有特定的配置文件,本文的最后会提到。可先看看jdk自带的一些例子。

我们举个HelloWorld的例子来说明。先做以下假设:

* 当前目录是/HelloWorld(或c:\HelloWorld,以后都使用前一个)

* jdk版本为1.2.2 (linux下的)

* PATH环境变量设置正确。(这样可以在任何目录下都可以使用工具)

* 文件是HelloWorld.java,内容是:

public class HelloWorld

{

public static void main(String[] args)

{

System.out.println( "Hello World!\n ");

System.exit(0);

}

}

首先这个文件一定要写对,如果对c熟悉的话,很有可能写成这样:

public static void main(int argc,String[] argv)

{

....

}

这样是不对的,不信可以试一试。由于手头没有java的规范,所以作如下猜想: java 的application程序,必须以public static void main(String[])开始,其他不一样的都不行。

到现在为止,我们设置方面只设置了PATH。

1、当前路径就是指你的.class文件在当前目录下,

[HelloWorld]$ javac HelloWorld.java //这一步不会有多大问题,

[HelloWorld]$ java HelloWorld // 这一步可能就会有问题.。

如果出了象开头那样的问题,首先确定不是由于敲错命令而出错。如果没有敲错命令,那么接着做:

[HelloWorld]$ echo $CLASSPATH

或者c:\HelloWorld> echo %CLASSPATH%

看看CLASSPATH环境变量是否设置了,如果设置了,那么用以下命令:

[HelloWorld]$ CLASSPATH=

或者c:\HelloWorld> set CLASSPATH=

来使它为空,然后重新运行。这次用户类路径缺省的是". ",所以应该不会有相同的问题了。还有一个方法就是把". "加入到CLASSPATH中。

[/]$ CLASSPATH=$CLASSPATH:.

或者c:\HelloWorld> set CLASSPATH=%CLASSPATH%;

同样也可以成功. Good Luck。

2、当你的程序需要第三方的类库支持,而且比较常用,就可以采用此种方法。比如常用的数据库驱动程序,写servlet需要的servlet包等等。设置方法就是在环境变量中加入CLASSPATH。然后就可以直接编译运行了。还是以HelloWorld为例,比如你想在根目录中运行它,那么你直接在根目录下执行

$ java HelloWorld

或者c:\> java HelloWorld

这样肯定会出错,如果你的CLASSPATH没有改动的话.。我想大家应该知道为什么错了吧,那么怎么改呢?前面说过,用户类路径就是一些包含你所需要的类的目录,.jar档案包,.zip包。现在没有生成包,所以只好把HelloWorld.class所在的目录加到CLASSPATH了,根据前面的做法,再运行一次,看看,呵呵,成功了,换个路径,又成功了!!不仅仅以直接运行其中的类,当你要import其中的某些类时,同样处理。

不知道你想到没有,随着你的系统的不断的扩充,(当然了,都是一些需要java的东西。如果都加到这个环境变量里,那这个变量会越来越臃肿,虽然环境变量空间可以开很大,总觉得有些不舒服。看看下面一个方法。

3、在命令行参数中指明classpath。

还是和上面相同的目标,在任何目录下执行HelloWorld,用这个方法怎么实现呢?

[/]$ java -cp /HelloWorld HelloWorld

或者c:\> java -cp c:\HelloWorld HelloWorld

就可以了。这是这种方法的最简单的应用了。当你使用了另外的包的时候,还可以采用用这种方法。例如:

$ javac -classpath aPath/aPackage.jar:. myJava.java

$ java -cp aPath/aPackage.jar:. myJava

或者c:\> javac -classpath aPath\aPackage.jar;. myJava.java

c:\> java -cp aPath\aPackage.jar;. myJava

这种方法也有一个不方便的的地方就是当第三方包所在的路径较长或者需要两个以上包包的时候,每次编译运行都要写很长,非常不方便,这时候可以写脚本来解决。比如一个例子:

compile (文件,权限改为可执行,当前目录)

$ cat compile

---------------------------

#!/bin/bash

javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJavva.java ---------------------------

run (文件,权限改为可执行,当前目录)

$cat run

---------------------------

#!/bin/bash

java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava

---------------------------

或者:

compile.bat

c:\HelloWorld> type compile.bat

-------------------------

javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJavva.java -------------------------

run.bat

c:\HelloWorld> type run.bat

------------------------

java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava

------------------------

就可以了。试试看。

前面提到了扩展类,扩展类是什么呢?java的扩展类就是应用程序开发者用来扩展核心平台功能的java类的包(或者是native code)。虚拟机能像使用系统类一样使用这些扩展类。有人建议可以把包放入扩展目录里,这样,CLASSPATH也不用设了,也不用指定了,岂不是很方便?确实可以正确运行,但是个人认为这样不好,不能什么东西都往里搁,一些标准的扩展包可以,比如,JavaServlet,Java3D等等。可以提个建议,加一个环境变量,比如叫JARPATH,指定一个目录,专门存放用户的jar 、zip等包,这个要等SUN公司来做了。windows98下,我原来安装的时候,一直装不上,总是死机,好不容易装上了,缺省的是不能运行正确的,然后把tool.jar 放入CLASSPATH 后工作正常。现在作测试,去掉仍然是正确的。经过多次测试,发现如果原来曾装过jdk的都很好,没有装过的装的时候会死机,多装几次就可以了。如果你发现正确安装后,不能正常工作,就把tools.jar加入CLASSPATH,试一下。

二、包 (package)

Java中的“包”是一个比较重要的概念,package是这样定义的: Definition: A package is a collection of related classes and interfaces that provides access protection and namespace management。

也就是: 一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合。使用包的目的就是使类容易查找使用,防止命名冲突,以及控制访问。这里我们不讨论关于包的过多的东西,只讨论和编译,运行,类路径相关的东西。至于包的其他内容,请自己查阅相关文档。简单一点来说,包就是一个目录,下面的子包就是子目录,这个包里的类就是这个目录下的文件。我们用一个例子来说明。

首先建目录结构如下: PackageTest/source/,以后根目录指的是PackageTest目录,我们的源程序放在source目录下。源程序如下:

PackageTest.java

package pktest;

import pktest.subpk.*;

public class PackageTest

{

private String value;

public PackageTest(String s)

{

value = s;

}

public void printValue()

{

System.out.println( "Value of PackageTest is " + value);

}

public static void main(String[] args)

{

PackageTest test = new PackageTest( "This is a Test P ackage ");

test.printValue();

PackageSecond second = new PackageSecond( "I am in Pack ageTest ");

second.printValue();

PackageSub sub = new PackageSub( "I am in PackageTest ");

sub.printValue();

System.exit(0);

}

}

PackageSecond.java

package pktest;

public class PackageSecond

{

private String value;

public PackageSecond(String s)

{

value = s;

}

public void printValue()

{

System.out.println( "Value of PackageSecond is " + valu e);

}

}

PackageSub.java

package pktest.subpk;

import pktest.*;

public class PackageSub

{

private String value;

public PackageSub(String s)

{

value = s;

}

public void printValue()

{

PackageSecond second = new PackageSecond( "I am in subpackage. ");

second.printValue();

System.out.println( "Value of PackageSub is " + value );

}

}

Main.java

import pktest.*;

import pktest.subpk.*;

public class Main()

{

public static void main()

{

PackageSecond second = new PackageSecond( "I am in Main ");

second.printValue();

PackageSub sub = new PackageSub( "I am in Main ");

sub.printValue();

System.exit(0);

}

}

其中,Main.java 是包之外的一个程序,用来测试包外的程序访问包内的类,PackageTest.java 属于 pktest 这个包,也是主程序. PackageSecond.java 也属于pktest,PackageSub 属于 pktest 下的 subpk 包,也就是 pktest.subpk。详细使用情况,请参看源程序。

好了,先把源程序都放在 source 目录下,使 source 成为当前目录,然后编译一下,呵呵,出错了,

Main.java:1: Package pktest not found in import.

import pktest.*;

这里涉及到类路径中包是怎么查找的,前面我们做了一点假设: "只要包含了这个类就算找到了这个类 ",现在就有问题了。其实jdk的工具javac 、java 、javadoc都需要查找类,看见目录,就认为是包的名字,对于 import 语句来说,一个包对应一个目录。这个例子中,import pktest.*,我们知道类路径可以包含一个目录,那么就以那个目录为根,比如有个目录 /myclass,那么就会在查找/myclass/pktest 目录及其下的类. 所有的都找遍,如果没有就会报错。由于现在的类路径只有当前目录,而当前目录下没有 pktest 目录,所以就会出错。类路径还可以包含 .jar .zip文件,这些就是可以带目录的压缩包,可以把 .jar .zip文件看做一个虚拟的目录,然后就和目录一样对待了。

好了,应该知道怎么做了吧,修改后的目录结构如下:

PackageTest

|

|__source Main.java

|

|__pktest PackageTest.java PackageSecond.java

|

|__subpk PackageSub.java

然后重新编译,运行,哈哈,通过了。我们再来运行一下PackageTest。

[source]$ java pktest/PackageTest

怎么又出错了?

Exception in thread "main" https://www.sodocs.net/doc/d66993637.html,ng.NoClassDefFoundError: pktest/PackageTest 是这样的,java所要运行的是一个类的名字,它可不管你的类在什么地方,就象我们前面所讨论的一样来查找这个类,所以它把pktest/PackageTest看成是一个类的名字了,当然会出错了,应该这么做,

[source]$ java pktest.PackageTest

大家应该明白道理吧,我就不多说了。注意javac不一样,是可以指明源文件路径的,javac只编译,不运行,查找类也只有在源文件中碰到import时才会做,与源文件所在的包没有关系。似乎还又些不好的地方,怎么生成的 .class 文件这么分散呀,看着真别扭。别急,javac有一个 -d 命令行参数,可以指定一个目录,把生成的 .class 文件按照包给你好好地搁在这个目录里面.

[source]$ mkdir classes

[source]$ javac -d classes pktest/PackageTest.java

[source]$ javac -d classes Main.java

那么运行怎么运行呢?

[source]$ cd classes

[classes]$ java pktest.PackageTest

[classes]$ java Main

就可以了。其实jdk的这一套工具小巧简单,功能强大,不会用或者用错其实不关工具的事,关键是明白工具背后的一些原理和必要的知识。集成环境是很好,但是它屏蔽了很多底层的知识,不出错还好,一旦出错,如果没有这些必要的知识就很难办,只好上bbs问,别人只告诉了你解决的具体方法,下一次遇到稍微变化一点的问题又不懂了。所以不要拘泥于工具,java 的这一套工具组合起来使用,中小型工程(五六十个类),还是应付得下来的。

三、jar文件

以下把.jar.zip都看做是.jar文件。

1、从前面我们可以看出来jar文件在java中非常重要,极大地方便了用户的使用。我们也可以做自己的.jar包。

2、还是使用前面那个例子,Main.java是包之外的东西,用了pktest包中的类,我们现在就是要把pktest做成一个.jar包,很简单,刚才我们已经把pktest中的.class都集中起来了,

[classes]$ jar -cvf mypackage.jar pktest

就会生成mypackage.jar文件,测试一下,刚才我们生成的Main.class就在classes 目录下,所以,从前面可以知道:

[classes]$ java -cp mypackage.jar:. Main

就可以运行了。

3、如果你看过jdk所带的例子,你就会知道,.jar还可以直接运行,

[/demo]$ java -jar aJar.jar

那好,就那我们的试一试,

[classes]$ java -jar mypackage.jar

Failed to load Main-Class manifest attribute from mypackage.jar 看来我们的jar和它的jar还不一样,有什么不一样呢?拿它一个例子出来,重新编译,生成.jar文件,比较后发现,是.jar压缩包中META-INF/MANIFEST.MF文件不一样,多了一行,Main-Class: xxxxx,再看看出错信息,原来是没有指定Main-Class,看看jar命令,发现有一个参数-m,

-m include manifest information from specified manifest file 和出错信息有点关系,看来它要读一个配制文件. 只好照猫画虎写一个了。

[classes]$ cat myManifest

Manifest-Version: 1.0

Main-Class: pktest.PackageTest

Created-By: 1.2.2 (Sun Microsystems Inc.)

[classes]$ jar cvfm mypackage.jar myManifest pktest

added manifest

adding: pktest/(in = 0) (out= 0)(stored 0%)

adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflat ed 40%)

adding: pktest/subpk/(in = 0) (out= 0)(stored 0%)

adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(def lated 38%)

adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflate

d 42%)

[classes]$ java -jar mypackage.jar

Value of PackageTest is This is a Test Package

Value of PackageSecond is I am in PackageTest

Value of PackageSecond is I am in subpackage.

Value of PackageSub is I am in PackageTest

好了,成功了,这样就做好了一个可以直接执行的.jar文件。大家可以自己试一试做一个以Main为主程序的可执行的jar。

小结:

这篇文章中,我们讨论了java中的classpath,package,jar等基本但比较重要的东西,主要是classpath 并不是简单的一份CLASSPATH的完全功略,而是试图让读者明白其原理,自己思考,自己动手。其实大多数东西都在sun的java doc 中都有,我只不过结合例子稍微谈了一下,希望能有所帮助。由于条件所限,只测试了 jdk1.2.2在98及linux

的情况,其他版本的jdk和平台请大家自己测试,错误在所难免,还请指正。

下面是一些需要注意的问题:

1、如果类路径中需要用到.jar文件,必须把jar文件的文件名放入类路径,而不是其所在的目录。

2、在任何时候,类名必须带有完全的包名。

3、". " 当前目录最好在你的类路径中。

下面是一些常见的编译和运行的模式:

(1)To compile HelloWorld.java app in the default package in

C:\MyDir,

use CD \MyDir C:\jdk1.3\bin\Javac.exe -classpath . HelloWorld.java

(2)To run a HelloWorld.class app,in the default package in

C:\MyDir,

Use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath . HelloWorld

(3)To run a HelloWorld.class app,in the default package in a jar in C:\MyDir,

use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar

HelloWorld

(4)To compile a HelloWorld.java app in C:\MyPackage,in package MyPackage,

use CD \C:\jdk1.3\bin\Javac.exe -classpath . MyPackage\HelloWorld.java (5)To run a HelloWorld.class app in C:\MyPackage,in package

MyPackage,

use CD \C:\jdk1.3\bin\Java.exe -classpath . MyPackage.HelloWorld

(6)To run a HelloWorld.class app in C:\MyPackage,in a jar in package MyPackage,

use CD \MyDir C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar

MyPackage.HelloWorld

(注: default package 指的是在程序中不指定任何包)。

最后一个小小的建议,把sun的jdk tools documentation好好地看一看,把jdk 的那些工具 java javac javadoc jar javap jdb......好好用一用,会有好处的。The Simplest Is The Best。

参考文献:

Java Tools Documentation.

Java Glossary https://www.sodocs.net/doc/d66993637.html,

Java集合类知识点总结

Java集合类 Java集合类 (1) 1.Map (3) 1.1.HashMap (3) 1.1.1.底层实现 (3) 1.1.2.特点 (3) 1.1.3.源码分析 (4) 1.1.4.多线程可能出现的问题 (5) 1.2.ConcurrentHashMap (6) 1.2.1.底层实现 (6) 1.2.2.源码分析 (7) 1.3.HashTable (9) 1.3.1.HashTable是线程安全的,因为所有方法上都加了synchronized关键 字。9 1.3.2.HashTable的key和value都不可以为null。 (9) 1.3.3.扩容时,capacity=2*capacity+1 (9) 1.3.4.数组默认大小为11 (9) 1.3.5.查找下标时,没有使用hash&length-1,而是直接进行计算的 (9) 1.4.TreeMap (9) 1.4.1.底层实现为红黑树 (9) 1.4. 2.TreeMap是一个有序的key-value集合,基于红黑树实现。该映射根据 其键的自然顺序进行排序,或者根据创建时提供的Comparator进行排序 (10) 1.4.3.接口实现 (10) 1.4.4.Entry (11) 1.5.LinkedHashMap (11) 1.5.1.底层是数组+链表+红黑树+双向链表 (11) 1.5.2.维护链表顺序和访问顺序 (11) 1.5.3.LinkedHashMap 可以通过构造参数 accessOrder 来指定双向链表是否在 元素被访问后改变其在双向链表中的位置。 (11) 1.5.4.当accessOrder为true时,get方法和put方法都会调用recordAccess 方法使得最近使用的Entry移到双向链表的末尾;当accessOrder为默认值 false时,recordAccess方法什么也不会做。 (11) 1.5.5.LRU实现 (11) 2.Collection (11) 2.1.List (12) 2.1.1.ArrayList (12) 2.1.2.LinkedList (13) 2.1.3.CopyOnWriteArrayList (13) 2.2.Set (14) 2.2.1.HashSet (14)

基于java socket的聊天室项目文档

北京邮电大学软件学院 2010-2011 学年第 1学期实训项目文档 (每个项目小组一份) 课程名称:全日制研究生实训 项目名称:通信软件实训 项目完成人: 姓名:学号: 姓名:学号: 姓名:学号: 姓名:学号: 姓名:学号: 姓名:学号: 指导教师: 日期:2011年1月21日

基于java socket的聊天室实现 一 . 实训项目目的和要求(说明通过本项目希望达到的目的和要求) 目的:熟练掌握socket编程原理,并用java socket实现聊天室 要求:实现p2p和聊天室功能 二 . 实训项目开发环境(说明本项目需要的环境) 开发工具:Eclipse SDK Version: 3.5.2 和NetBeans 6.9.1 版本 系统:win7 三 . 实训项目内容(说明本项目的内容,如:问题分析、设计方案、算法、设计图等) 1.问题分析 网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台 主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协 议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一 地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(tcp)的 或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要 关心IP层是如何处理数据的。目前较为流行的网络编程模型是客户机/服务 器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。 客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运 行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户, 同时自己继续监听服务端口,使后来的客户也能及时得到服务。 两类传输协议:TCP;UDP。TCP是Tranfer Control Protocol的简称, 是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个 顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或 接收操作。

JAVA中常用的集合类型

JAVA常用的高级数据类型——集合类型 一、JAVA语言中的集合类型主要有三种形式:Set(集)、List(列表)、Map(映射),每种类型的集合都包括三部分:接口、实现和算法。 a)集合接口实现集合的操作和集合的具体功能实现细节的相互分离—— Set接口、List接口、Map接口 b)集合的具体功能实现类实质上是各种可重用的数据结构的具体表示 List接口的实现类有ArrayList、LinkedList、Stack和Vector等 集合类,Vector 类提供了实现可增长数组的功能,随着更多元素加 入其中,数组变的更大。在删除一些元素之后,数组变小。 Set接口的实现类有HashSet、LinkedHashSet和TreeSet等集合类 Map接口的实现类有HashMap、Hashtable、LinkedHashMap、Properties和TreeMap等集合类。 c)集合的算法指可以对实现集合接口的各个集合的功能实现类提供如排 序、查找、交换和置换等方面的功能实现。 二、List接口 1.List接口代表有序的集合,可以对List接口代表的有序集合中每个元素 的插入位置进行精确地控制,并利用元素的整数索引(代表元素在集合中的位置)访问元素中的各个成员,List接口代表的集合是允许出现重复元素的。 2.List接口主要成员方法: 1)void add(int index,E element)在列表指定位置插入指定元素 2)E get(int index) 返回结合中指定位置的元素 3)E remove(int index) 移除集合中指定位置的元素 4)E set(int index,E elment) 用指定元素替换集合中指定位置的元素 5)boolean add(E o) 向列表的尾部追加指定的元素 6)boolean contains(Object o) 如果列表包含指定的元素,则返回true。 7)boolean isEmpty() 如果列表不包含元素,则返回 true。 8)int size() 返回列表中的元素数 9)Iterator iterator()返回以正确顺序在列表的元素上进行迭代的迭代器。 3.List的实现类 List在数据结构中分别表现为数组(ArrayList)、向量(Vector)、链表(LinkedList)、堆栈(Stack)和队列等形式。 Vector集合和ArrayList集合都是采用数组形式来保存对象,区别在于ArrayList集合本身不具有线程同步的特性,不能用在多线程的环境下,可以使用ArrayList集合能够节省由于同步而产生的系统性能的开销。而Vector集合实现了对线程同步的支持,因此在多线程并发访问的应用环境下,该集合本身能够保证自身具有线程安全性。在多线程的并发访问中,可以将Vector集合的对象实例设计为类中的成员属性,而应该将ArrayList 集合的对象实例设计为局部对象。 public class UserInfo{ List oneVector=new Vector(); public void execute(){

JAVA代码编写一简单网络聊天程序

要求:聊天室服务器、聊天室客户端;客户端之间可以聊天。 因为我是初级选手,想借此程序分析学习java,所以代码最好多一点注释... 分数有限,望大家不吝赐教!!问题补充: 需要图形用户界面哦,最好用swing组件 服务器端:采用多线程,可以向客户广播:当前聊天室人数,客户名称列表,客户进入离开提示; 客户端:可以设定昵称,性别,客户间可以私聊 服务器端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import https://www.sodocs.net/doc/d66993637.html,.*; public class Server extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); ServerSocket server = null; Socket socket = null;BufferedReader instr =null;PrintWriter os=null ; //Construct the frame public Server() { jbInit(); } class MyThread extends Thread{//该线程负责接受数据 public void run(){ try{ while(true){ this.sleep(100); instr= new BufferedReader(new InputStreamReader(socket.getInputStream())); if(instr.ready()){ //检查是否有数据 jTextArea1.append("客户端: "+instr.readLine()+"\n"); } } }catch(Exception ex){} }

java集合类总结

1.本讲内容:集合collection (数组和集合90%功能相似,但是最大的区别是,数组在初始化的时候必须确定大小,而集合不用,而且集合是一堆的类,使用起来非常方便。) 讲集合collection之前,我们先分清三个概念: 1colection 集合,可用来存储任何对象的一种数据结构(容器)。 2Collection 集合接口,指的是,是Set、List 和Queue 接口的超类接口 3Collections 集合工具类,指的是类。 SCJP考试要求了解的接口有:Collection , Set , SortedSet , List , Map , SortedMap , Queue , NavigableSet , NavigableMap, 还有一个Iterator 接口也是必须了解的。 SCJP考试要求了解的类有:HashMap , Hashtable ,TreeMap , LinkedHashMap , HashSet , LinkedHashSet ,TreeSet , ArrayList , Vector , LinkedList , PriorityQueuee , Collections , Arrays 下面给出一个集合之间的关系图: 上图中加粗线的ArrayList 和HashMap 是我们重点讲解的对象。下面这张图看起来层级结构更清晰些。 我们这里说的集合指的是小写的collection,集合有4种基本形式,其中前三种的父接口是Collection。 4List 关注事物的索引列表 5Set 关注事物的唯一性 6Queue 关注事物被处理时的顺序 7Map 关注事物的映射和键值的唯一性 一、Collection 接口 Collection接口是Set 、List 和Queue 接口的父接口,提供了多数集合常用的方法声明,包括add()、remove()、contains() 、size() 、iterator() 等。 add(E e) 将指定对象添加到集合中 remove(Object o) 将指定的对象从集合中移除,移除成功返回true,不成功返回false contains(Object o) 查看该集合中是否包含指定的对象,包含返回true,不包含返回flase size() 返回集合中存放的对象的个数。返回值为int clear() 移除该集合中的所有对象,清空该集合。 iterator() 返回一个包含所有对象的iterator对象,用来循环遍历 toArray() 返回一个包含所有对象的数组,类型是Object toArray(T[] t) 返回一个包含所有对象的指定类型的数组 我们在这里只举一个把集合转成数组的例子,因为Collection本身是个接口所以,我们用它的实现类ArrayList做这个例子:例子1: package edu.xjfu;

Java源代码___聊天室

Java 聊 天 室 制作人:_____杨永生_____ 制作时间:2012.9.26 目录 1本文简介 (2) 2聊天室截图与说明 (2) 2.1用Java编译: (2) 2.2服务器登录界面 (2) 2.3服务器窗口 (2) 2.4客服端登录界面 (3) 2.5客服端窗口 (3) 3服务器端 (6) 3.1MyServer()方法 (6) 3.2Login()方法 (10) 3.3Time()方法 (13) 4客户端 (14) 4.1MyClient()方法 (14) 4.2Login()方法 (18) 4.3Time()方法 (20)

1 本文简介 这是一个简单的Java聊天室,仅提供给一些刚学Java的学生做实验,本文也是仅供参考. 本文代码都有注释,希望读者能读懂代码,本实验内部还有一些错误,比如只能一条一条的发信息,不能连发,希望能解决本问题的朋友能给我发信息,我的QQ号就是百度号! 2 聊天室截图与说明 2.1 用Java编译: 本代码有七个类,放在六个java文件中,类名在下方希望读者自己观看, 2.2 服务器登录界面 要先运行服务器端的程序 用户名:y 密码:1 用户名密码可以自己设定点击确定可以登录,2秒后到服务端界面 2.3 服务器窗口

聊天室的IP为本机的网络虚拟IP,在任何电脑上都能用,端口应设置在1024以后, 2.4 客服端登录界面 和服务器端的登录一样 2.5 客服端窗口

当登录上后客服端就显示已经连接了,此时服务器端的窗口如下

由于本程序设计的不是很完整,具体的聊天要先从客服端开始: 在客服端输入一条聊天内容后按确定,在服务器端就可以收到信息,之后客户端不能输入了,要等待服务器端来信息后才能继续输入信息. 想要结束聊天,直接可以关闭窗口,也可以输入’bye’后断开聊天

java集合类

Java集合类 Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等;除此之外java集合还可用于保存具有映射关系的关联数组。 Java集合大致可以分为Set、List、Quequ和Map四种体系: Set代表无序、不可重复的集合; List代表有序、重复的集合; Map代表具有映射关系的集合; Queue体系集合,代表一种队列集合 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称为对象)“丢进”该容器中。在java5之前,java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型出来;从java5增加泛型以后,java集合可以记住容器中对象的数据类型,从而可以编写出更简洁、健壮的代码。 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。 集合类和数组不一样,数组元素既可以基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(保存对象的引用变量)。 Java的集合类主要由两个接口派生而出:Collection 和Map,Collection和Map是java集合框架的根接口,这两个接口又包含了一些子接口或实现类。 Set和list接口是collection接口派生的两个子接口,它们分别代表了无序集合和有序集合;Queue是java提供的队列实现。 Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。(就像成绩单,每项成绩都是由两个值组成,即科目名和成绩。对于一张成绩表,科目通常不会重复,而成绩是可重复的,通常习惯根据科目来查阅成绩,而不会根据成绩来查阅科目)map里key是不可以重复的,key用于标识集合里的每项数据,如果需要查阅map中的数据时,总是根据map的key来获取。 Set,list,queue,map这4个接口,可以把java所有集合分成三大类,其中set集合类似于一个罐子,把一个对象添加到set 集合时,set集合无法记住添加这个元素的顺序,所以set里的元素不能重复(否则系统无法准确识别这个元素);list集合非常像一个数组,它可以记住每次添加元素的顺序、且list的长度可变。Map集合也像一个罐子,只是它里面的每项数据都是由两个值组成。 如果访问list集合中的元素,可以直接根据元素的索引来访问;如果访问map集合中的元素,可以根据每项元素的key来访问其value;如果访问set集合中的元素,则只能根据元素本身来访问(这也是set集合里元素不允许重复的原因) 对于set、list、Queue和map四种集合,最常用的实现类分别是HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList和HashMap、TreeMap等实现类。 Collection的用法有:添加元素、删除元素、返回collection集合中的元素个数以及清空整个集合等。Collection实现类都重写了toString()方法,该方法可以一次性的输出集合中的所有元素。 Java8为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable 接口是Collection接口的父接口,因此Collection集合也可以直接调用该方法。 当程序调用Iterable的forEach(Consumer action)遍历集合元素时,程序会一次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的抽象方法)。正因为Consumer是函数式接口,因此可以使用lambda表达式来遍历集合元素。

Java中的集合类

Java中的集合类 (Collection framework)我们在前面学习过java数组,java数组的程度是固定的,在同一个数组中只能存放相同的类型数据。数组可以存放基本类型的数据,也可以存入对象引用的数据。 在创建数组时,必须明确指定数组的长度,数组一旦创建,其长度就不能改变,在许多应用的场合,一组数据的数目不是固定的,比如一个单位的员工数目是变化的,有老的员工跳槽,也有新的员工进来。 为了使程序方便地存储和操纵数目不固定的一组数据,JDK中提供了java集合类,所有java集合类都位于java.util包中,与java数组不同,java集合类不能存放基本数据类型数据,而只能存放对象的引用。 Java集合类分为三种 Set(集合):集合中对象不按特定的方式排序。并且没有重复对象,但它有些实现类中的对象按特定方式排序。--无序,不能重复 List(列表):集合中的对象按照检索位置排序,可以有重复对象,允许按照对象在集中的索引位置检索对象,List和数组有些相似。--有序,可以重复 Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复,它的有些实现类能对集合中的键对象进行排序。 Java的主要集合类的框架图 Collection和Iterator接口 在Collection接口中声明了适用于java集合(只包括Set和List)通用方法。 Collection接口的方法 方法描述

boolean add(Object o) 向集合中加入一个对象的引用 void clear( ) 删除集合中所有对象,即不再对持有对象的引用boolean contains(Object o) 判断在集合中是否含有特定对象的引用 boolean isEmpty() 判断集合是否为空 Iterator iterator( ) 返回一个Iterator对象,可用它来遍历集合中的元素boolean remove(Object o) 从集合中删除一个对象的引用 int size( ) 返回集合中元素的数目 Object [ ] toArray() 返回一个数组,该数组包含集合中的所有元素 Set接口和List即可都继承了Collection接口,而Map接口没有继承Collection接口,因此可以对Set对象和List对象调用以上方法,但是不能对Map对象调用以上方法。Collection接口的iterator()和toArray()方法多用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。 Iterator隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。Iterator接口中声明了如下方法: ●hasNext():判断集合中的元素是否遍历完毕,如果没有,就返回true。 ●next():返回下一个元素 ●remove():从集合中删除上一个由next()方法返回的元素。 注意:如果集合中的元素没有排序,Iterator遍历集合中元素的顺序是任意的,并不一定与像集合中加入的元素的顺序一致。 Set(集) Set是最简单的一种集合,集合中的对象不按特定方式排序,并没有重复对象。Set接口主要有两个实现类:HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构,链表数据结构能提高插入核算出元素的性能。TreeSet类实现了SortedSet接口中,具有排序功能。 List(列表) List的主要特征使其元素已先行方式存储,集合中允许存放重复对象。List接口主要的实现类包括: ●ArrayList—ArrayList代表长度可变的数组。允许对元素进行快速的随机访问,但是向 ArrayList中插入与删除元素的速度较慢。 ●LinkedList—在实现中采用链表数据结构。对顺序访问进行了优化,向List中插入和 删除元素的速度较快,随机访问速度则相对较慢,随机访问是指检索位于特定索引位置元素。 Map(映射) Map(映射)是一种吧键对和值对象进行映射的集合。它的每一个元素都包含一对键对象和值对象,而之对象仍可以是Map类型。以此类推,这样就形成了多级映射。向Map集合中加入元素时,必须提供一对键对象和值对象,从Map集合上检索元素只要给出键对象,就会返回值对象。 实例1 CollectionAll.java

java简单聊天小程序

网络编程java简单聊天小程序[下次修改成多线程的,这个必须等待对方输入结束,有机会修改成可视化窗口] By 刘汪洋 写入正确的ip地址即可正常用当然目前只停留在命令行界面 还没有写成可视化窗口界面 运行时请带上参数 如java TransServer 张三 Java TransClient 李四 ( 和刘正南在局域网试验的截图成功 这是修改后的 加上了姓名! ) (修改前的截图)

代码: 客户端: package com.baidu.chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import https://www.sodocs.net/doc/d66993637.html,.Socket; import https://www.sodocs.net/doc/d66993637.html,.UnknownHostException; // 简单聊天小程序客户端 public class TransClient { public static void main(String[] args)

{ if(args[0]==null) args[0] = "他"; startClient(args[0]); } private static void startClient(String name) { Socket sk = null; BufferedReader bufr = null; try { sk = new Socket("127.0.0.1",10000);// 1 创建 socket服务 bufr = new BufferedReader(new InputStreamReader(System.in));// 2 获取录入键盘 PrintWriter out = new PrintWriter(sk.getOutputStream(),true);// 3 获取输出流true表示自动刷新 BufferedReader bufIn = new BufferedReader(new InputStreamReader(sk.getInputStream()));// 4 获取输入流 // 5 发送获取 String text_send = ""; String text_get = ""; String ServerName = ""; System.out.print("聊天已开启..."+"\r\n"+"我说:");

java版基于UDP协议网上聊天程序课程设计

湖南工业大学 课程设计 资料袋 计算机与通信学院学院(系、部)2013 ~ 2014 学年第 1 学期课程名称网络协议分析指导教师李建设职称副教授 学生姓名专业班级网络工程学号 题目基于UDP协议网上聊天程序 成绩起止日期2013 年11 月25 日~2013 年12 月13 日 目录清单

5 6 课程设计任务书 2013 —2014学年第1 学期 学院(系、部)计算机与通信学院专业网络工程班级102 课程名称:网络工程学生姓名: 设计题目:基于UDP协议网上聊天程序指导教师:李建设 完成期限:自2013 年11 月25 日至2013 年12 月13 日共 3 周 容 及 任 务 一、设计内容 实现一个基于UDP协议的简单的聊天程序,包括服务器和客户端。 1.支持多人聊天。 2.客户端具有图形化用户界面。 二、设计任务 课程设计说明书(纸质+电子版),内容包括:设计内容、系统分析(包括可行性分析、需求分析等)及功能分析;系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。 三、设计要求 1.按功能要求开发系统,能正确运行。程序代码书写规范,有充足的注释。 2.课程设计所使用的编程语言任选,但建议使用C或C++; 3.绿色软件:程序运行不需安装,避免写系统和注册表; 进 度 安 排 起止日期工作内容 2013-11-25~2013-11-3 选题 2013-12-1~2013-12-3 系统分析和设计; 2013-12-4~2013-12-8 熟悉软件开发工具、编码系统、系统测试 2013-12-9~2013-12-13 撰写并提交课程设计说明书(含电子文档)、源程序等。

Java中集合类用法总结

帮助 | 留言交? | 登录 首页我的图书馆主题阅读精彩目录精品文苑Tags 会员浏览好书推荐 以文找文 如何对文章标记,添加批注? Java 中集合?用法总结(转载) wade0564 收录于2010-07-08 阅读数:查看 收藏数:7 公众公开 原文来源 tags : java 集合类 欢迎浏览 wade0564 个人图书馆中收藏的文章,想收藏这篇好文章吗,赶快 吧,1分钟拥有自己的个人图书馆! 我也要收藏 举报 Java 中集合?用法总结 收藏 Collection ├List │├LinkedList │├ArrayList (异步,线程不安全,空间用完时自动增长原容量一半)│└Vector (同 步,线程安全,空间用完时自动增长原容量一倍)│ └Stack └Set ├HashSet └TreeSet Map ├Hashtable ├HashMap ├WeakHashMap └TreeMap Map 接口: | + -- WeakHashMap: 以弱键 实现的基于哈希表的 Map 。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条 | 目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为 可终止的,被终 | 止,然后被回收。丢弃某个键时, 其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。此实现 | 不是同步的。 | + -- TreeMap:该映射根据其键的自然顺序进行 排序,或?根据创建映射时提供的 Comparator 进行 排序,具体取决于使用的 | 构造方法。此实现不是同步的。 | + -- HashMap:基于哈希表的 Map 接?的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了 | 非同步和允许 使用 null 之外,HashMap 类与 Hashtable ?致相同。)此类不保证映射的顺序,特别是它不保证该顺 | 序恒久不变。此实现不是同步的。 | +-- SortedMap: 进一步提供关于键的总体排序 的 Map 。该映射是根据其键的自然顺序进 行排序的,或?根据通常在创建有 序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet 、keySet 和 values 方法返回 )进行迭代时,此顺序就会反映 出来。要采用此排序方式,还需要提供一些其他操作(此接?是 SortedSet 的对应映 射)。 Collection 接口: | 热点推荐 中国经典汤品——广东汤常用多音字汇总 如果你失恋。。。这些话...影响世界的100个管理定律汽车发动机?作过程和原理分析温家宝总理答中外记?问女人味,有多少男人可以读懂?珍稀的白头叶猴(组图)三鹿门事件之——中国,...国家公务员职务与级别当代古筝四美 付娜《渔...生活?秘方 真的很实用...哲理?品:守护梦想聚会时可以玩的?游戏依赖型人格障碍的表现和治疗经典妙语,十分精彩江边施救[贴图]李一男2003年在港湾...电脑速度慢的解决方法 ...重装系统后必须做的10件?事

java集合-练习题解析

1. 填空 Collection 接口的特点是元素是___无序可重复______; List 接口的特点是元素__有__(有|无)顺序,_可以___(可以|不可以)重复; Set 接口的特点是元素__无___(有|无)顺序,____不可以__(可以|不可以)重复;Map 接口的特点是元素是__key、value映射______,其中__value__可以重复,_key___不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); } public static void printList(List list){ //1 for(int i = 0; i< list.size();i++){ System.out.println(list.get(i)); } for(Object o : list) { System.out.println(o); } Iterator itor = list.iterator(); while(itor.hasNext()){ System.out.println(itor.next()); } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello Java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别? 4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使 用上有什么区别?实现上有什么区别? 3. (List)写出下面程序的运行结果

Java集合体系结构分析与比较

Java集合体系结构分析与比较 1. Java集合框架图 Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. Java集合框架图如下: 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现.可扩展为自定义集合类. 实现类:8个实现类(实线表示),对接口的具体实现. 在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码. Java集合的顶层接口是Collection,Collection 接口是一组允许重复的对象.Java集合框架主要由以下三个接口组成: (1) Set 接口继承Collection,但不允许重复,使用自己内部的一个排列机制. (2) List 接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列.

(3) Map接口是一组成对的键-值对象,即所持有的是 key-value pairs.Map中不能有重复的key,拥有自己的内部排列机制. 容器中的元素类型都为Object,从容器取得元素时,必须把它转换成原来的类型.简化后的集合框架图如下: 2. 接口Collection 用于表示任何对象或元素组,想要尽可能以常规方式处理一组元素时,就使用这一接口. (1) 单元素添加、删除操作: boolean add(Object o):将对象添加给集合 boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o (2) 查询操作: int size():返回当前集合中元素的数量 boolean isEmpty():判断集合中是否有任何元素 boolean contains(Object o):查找集合中是否含有对象o Iterator iterator():返回一个迭代器,用来访问集合中的各个元素 (3) 组操作:作用于元素组或整个集合 boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素 boolean addAll(Collection c) : 将集合c 中所有元素添

聊天程序java

目录 前言 ............................................................................................................................................. - 1 - 工程概况...................................................................................................................................... - 1 - 正文 ............................................................................................................................................. - 1 - 2.1课程任务及要求.................................................................................................................... - 1 - 2.2选题意义................................................................................................................................ - 2 - 2.3 程序需求分析....................................................................................................................... - 2 - 2.3.1可行性分析......................................................................................................................... - 2 - 2.3.2 服务器端............................................................................................................................ - 2 - 2.3.3 客户端................................................................................................................................ - 3 - 2.4 算法设计............................................................................................................................... - 3 - 2.4.1 UML图如下:................................................................................................................... - 3 - 2.4.2 C/S模式套接字的连接...................................................................................................... - 4 - 2.4.3 文字聊天的实现.............................................................................................................. - 4 - 2.5 程序设计与实现................................................................................................................... - 5 - 2.5.1建立连接............................................................................................................................. - 5 - 2.5.2断开连接........................................................................................................................... - 5 - 2.5.3 C/S模式套接字的连接................................................................................................... - 6 - 2.6程序测试与分析.................................................................................................................... - 8 - 2.6.1启动服务器......................................................................................................................... - 8 - 2.6.2启动客户端......................................................................................................................... - 8 - 2.6.3成功启动客户端................................................................................................................. - 8 - 2.6.4聊天过程............................................................................................................................. - 9 - 2.6.5 断开连接............................................................................................................................ - 9 - 2.7课程设计小结...................................................................................................................... - 10 - 参考文献.................................................................................................................................... - 10 - 课程设计总结............................................................................................................................ - 11 - 致谢 ........................................................................................................................................... - 12 - 附录 ........................................................................................................................................... - 13 -

相关主题