已阅读5页,还剩140页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,Java技术及其应用,2,第1章 语言基础 第2章 面向对象结构 第3章 基本I/O 第4章 增强性能类 第5章 收集与数据结构应用 第6章 图形用户界面及桌面应用 第7章 小程序及多媒体应用 第8章 JDBC与数据库应用 第9章 JavaBeans及组件应用 第10章 网络与Web服务应用,3,Java技术及其应用,第1章 语言基础,4,本章将对Java的数据类型、表达式、控制流程、字符串、正则表达式等逐一进行详细介绍。这些内容是各种编程语言的基础,必须首先了解清楚。,5,1.1 数据类型,整型 浮点型 基本类型 字符型 数据类型 布尔型 复合类型 数组类型 类/接口类型,6,Java的标记共有5种: 标识符(identifier),关键字(keywork),字面量(literal),运算符(operator)和分隔符(separator)。,1.1.1 Java的词法,7,注释 Java有三种注释格式: /* . */ 用于多行注释。 / . 用于单行注释,到行尾自动终止。 /* . */ 用于自动文档产生器javadoc产生注释文档,它必须位于声明(declaration)部分之前。,8,变量用于表示Java在内存中存储的一个数据,它用带有类型的标识符表示,需要用声明语句来建立: type identifier ,identifier;,1.1.2 基本数据类型的变量与声明,9,1. 整型变量 整型变量有四种,分别是8位的byte类,16位的short类,32位的int类和64位的long类。 2. 浮点型变量 浮点型变量有float型和double型两种,前者是32位单精度浮点数,后者是64 位双精度浮点数。 3. 字符型变量 Java的字符类型变量char是16位无符号整数,用于表示16位的Unicode。 4. 布尔型变量 布尔型变量boolean可取逻辑真和假两值。,10,变量声明之后,它的作用范围(scope)就确定了: 从变量声明的位置开始到它所在的代码块(block)结束之处。所谓块就是由花括号对 包含的一段代码。 如果在一个大范围内嵌套了一个小范围,而两个范围的某个变量同名,当程序进入小范围时,大范围的同名变量会被隐藏不用,直到退出小范围才恢复使用。,1.1.3 变量范围,11,数组是Java的一种复合类型,是由同类型的对象组成的,这些对象可由索引(indexing)来引用。数组中的对象也可以是数组,即数组的嵌套,但并不象C+那样称为多维数组。 声明数组用方括号对 加在标识符后(或类型后),如: int A ; 或 int A;,1.1.4 数组类型,12,Java的表达式由标识符、关键字、字面量、运算符、分隔符以及变量等元素构成,对这些元素执行运算并返回某个值。表达式可用于对变量赋值,也可以作为程序控制的条件。 表达式进行的运算取决于构成的各种元素的类型,以及运算的优先顺序,按先高后低,先左后右的规则进行,加了括号()的部分则首先计算。,1.2 表达式,13,表达式的运算按运算符的功能来分类,可以分为算术运算(+,-,*,/,%,+,-),关系运算(,=,&,|,),赋值运算(=,op=),条件运算(?:),强制类型转换(type)expr,和其他运算( 如实例运算 instanceof,分量运算(.),内存分配运算new,方法调用运算()等)。,14,算术运算对整型和浮点型数据进行操作,分为一元运算和二元(binary)运算两种。,1.2.1 算术运算,15,1.2.2 关系运算,关系运算是两个操作数的比较,主要用于整型和浮点型数据, 运算结果是个布尔型值true或false(而不是数字1或0),可用于逻辑判断。,16,布尔逻辑运算包括逻辑非 (logical negation)(!),逻辑与(&),逻辑或(|)三种,用于对布尔型数据进行运算。,1.2.3 布尔逻辑运算,17,位运算注意用于对整型数据进行二进制位的操作。,1.2.4 位运算,18,赋值运算是把右边的表达式的值赋给左边的变量,运算顺序从右向左。 若在“=“号前加其他二元运算符op,构成op=,称为组合(combination)赋值运算。实际上是 a = a op b简写为 a op= b。,1.2.5 赋值运算,19,条件运算(?:)是个三元(ternary)运算符,格式为: expression ? statement1 : statement2 表达式 expression 的布尔值为真时执行statement1,为假时执行 statement2,Statement1和statement2的数据类型要一致。,1.2.6 条件运算,20,Java是不允许自动类型转换的,若想把某种类型的数据转换为另一种类型的数据,必须用类型转换运算来实现。转换格式为: (类型)数据,如: int a; char b=0; a=(int)b; b=(char)a;,1.2.7 类型转换运算,21,Java的其他运算如实例运算instanceof,分量运算,方法调用(),内存分配运算new等将在以后各章陆续出现。,1.2.8 其他运算,22,Java的控制流程(control flow)用于使程序按正确顺序逐步进行,为程序提供了运行方向。有了控制流方法,程序就可以进行选择、重复等动作。Java的控制流方法包括如下四类: 选择类(decision making): if-else,switch 循环类(loop): for,while,do-whlie 异常处理类(exceptions): try-catch-throw 杂类(miscellaneous): break,continue,lable,return,1.3 控制流程,23,if-else流程是Java语言的基本控制方法,格式如下: if (boolean-expr) statement1; else statement2; 根据表达式boolean-expr的布尔值选择执行,为真时执行statement1语句,为假时执行statement2语句(若无else部分则不做任何事情)。,1.3.1 if-else流程,24,switch流程也是选择型的,适用于多于两种选择的情况,其格式如下: switch (expression) case value1: statement1;break; case value2: statement2;break; case valueN: statementN;break; default : statement; ,1.3.2 switch流程,25,1.3.3 for流程,for流程是循环类流程,其作用是重复执行称为循环体的一段程序。由循环初始,循环迭代,循环结束三部分控制。其格式为: for (初始表达式; 结束判断; 迭代表达式) 循环体; 初始部分告诉程序从何时开始循环,结束部分告诉程序何时结束循环,迭代部分修改控制循环次数的变量,循环体是需要重复执行的部分.,26,对于数组类型和收集(Collection)类,Java新增了一种叫增强的for语句的语法,可以使for循环更紧凑和易读。 int a = 0,1,2,3,4,5,6,7,8,9; for (int i : a) System.out.println(“This is: “ + i); ,1.3.4 增强的for流程,27,while流程也属于循环类,常用于循环次数不固定的场合。其格式为: 初始化 while (条件表达式) 循环体; 迭代部分; 程序首先判断条件表达式的布尔值,为假则不进入循环; 为真则进入循环体。每循环一次都要再次判断条件表达式,直到表达式为假时才退出循环。,1.3.5 while流程,28,do-while流程先执行循环体一次,再判断条件表达式决定是否继续循环。其格式为: 初始化 do 循环体; 迭代部分; while (条件表达式); 进入do后,即使条件表达式为假,也执行循环体一次,然后再根据条件表达式的真假决定循环或退出。,1.3.6 do-while流程,29,除了用于退出switch流程外,break还用于退出for,while,do-while等流程。其格式如下: break label; 其中label(标号)是可选部分。如果没有label部分,break只退出一层程序块,即一对花括号范围。,1.3.7 break流程,30,如果希望退出多层程序块,只需在某块前加个标号,同时在 break 后面加上同一标号,就可以达到目的。这是Java对break功能的扩充,见后面label部分的说明。,31,continue流程用于提前结束本次循环,即使循环体中还有其他语句未执行也不执行了,转去判断循环条件表达式,以决定继续循环或退出。其格式为: continue label; 同样,label是可选部分。如果没有label,continue只结束一层循环,即所在一对花括号范围。,1.3.8 continue流程,32,1.3.9 label流程,label提供了控制多层循环的方法,可与break或continue配合使用。一般是在某个循环体前加上标号,在break或continue后使用该标号,从而控制循环。其格式为: label: statement ; break label(或 continue label); 为了保持程序的结构化特点,不要随意在非循环结构体语句前加标号,只限于加在循环结构前。,33,1.3.10 return流程,return是指从方法中返回,用于有多个方法的Java程序。如果程序只有一个main方法则不必采用return。其格式为: return expression; expression是返回一个值给调用方法的地方,如果方法声明为void型,则不用返回任何值。注意返回值类型必须与方法声明的类型一致。,34,字符串常量又叫串字面量,是用双引号包括起来的任意数量的字符。Java用String类存放字符串常量,不能修改,可以作为参数传递,也可以被多个并发执行的线程所共享,而不会引起任何副作用。 如果字符串要变动,则采用StringBuilder类来操作。该类相当于有个字符缓冲区,用所提供的方法修改串中的字符。,1.4 字符串,35,1.4.1 String类,创建String类对象可以用串字面量: String s =“Good morning”; 它与下式等价: String s = new String(“Goog morning”);,36,1.4.2 StringBuilder类,StringBuilder类对象是可以修改的字符串,它除了有长度方法length()外,还有容量方法capacity()。创建StringBuilder类对象格式如下: StringBuilder strb = new StringBuilder(); / 建立空的Stringbuilder对象, 容量是16单元 可以带整型参数(即指定缓冲区大小),如: StringBuilder strb = new StringBuilder(int initCapacity);,37,1.4.3 StringTokenizer类,Java早期版本用这个类来分割字符串,现在有更好的正则表达式方法和Sanner类方法。,38,1.5 数学类,Math类提供了许多实现标准数学运算功能的方法,还有一些数学值如PI。所有的Math成员都是静态的,不必为该类创建实例,直接用 Math.method(variable) 就可以调用这些方法,注意其返回类型和参数变量。,39,1.6 正则表达式,正则表达式(Regular Expression)是功能强、灵活的文本处理工具,它用某字符串集合中各串的公共特征来描述这个字符串集。这种特征可以称为模式(pattern),利用模式处理文本比利用字符串比较更有效。java.util.regex包主要有Pattern、Matcher、PatternSyntaxException等三个类支持正则表达式。,40,1.6.1正则表达式基础,如果想表示一个数可能是负值,可以用负号加问号放在数前,比如-?8。如果表示一位数字,可以用反斜线和d表示,应该写为d。如果表示一位数以上,正则表达式写为d+。如果表示一个数前面可能有正号或负号,应该写为-|+,其中|是逻辑或。,41,1.6.2 正则表达式字符类,abc a, b, 或 c (简单类) abc 除了 a, b 或 c外的任何字符 (非) a-zA-Z a到z, 或A到Z, 含 (范围) a-dm-p a到d, 或m到p: a-dm-p (并) a-z&def d, e或f (交) a-z&bc a到z, 除了b和c: ad-z (差) a-z&m-p a到z, 且非m到p: a-lq-z (差),42,1.6.3 预定义字符集,. 任何字符 (不一定匹配行终止符) d 一位数字: 0-9 D 一位非数字: 0-9 s 一个空白字符: tnx0Bfr S 一个非空白字符: s w 一个词字符: a-zA-Z_0-9 W 一个非词字符: w,43,1.6.4 量词,量词用来说明读入文本的方式,有贪心的(Greedy)、不情愿的(reluctant)、占有的(Possessive)三种。贪心是指匹配器先读入整个输入串进行匹配,不行再减少一个字符重新匹配。不情愿是指匹配器一次只读入一个字符进行匹配,最后才会读整个字符串。占有的是指匹配器读入整个输入串进行匹配一次,不减少字符。,44,1.6.5 边界匹配符, 行的开头 $ 一行的尾部 b 一个词的边界 B 一个非词的边界 A 输入的开头 G 前次匹配的尾部 Z 输入的尾部,但是用于最后终止符(如果有) z 输入的尾部,45,1.6.6 Pattern类,Pattern类提供了一个编译方法compile(),可接受一组标志影响模式匹配的方式。如Pattern.CANON_EQ,允许标准对等;Pattern.CASE_INSENSITIVE,允许不分大小写字母匹配;Pattern.COMMENTS,允许模式中有空白字符和注释;Pattern.MULTILINE,允许多行方式;Pattern.DOTALL,允许.代表任何字符;Pattern.LITERAL,允许模式字面解析;Pattern.UNICODE_CASE,允许也按统一码匹配;Pattern.UNIX_LINES,允许UNIX行方式。,46,1.6.7 Matcher类,Matcher类提供了解释模式和执行匹配操作的方法,如start(),end(),lookingAt(),find(),matches(),appendReplacement(StringBuffer sb, String replacement),appendTail(StringBuffer sb),replaceAll(String replacement),replaceFirst(String replacement),quoteReplacement(String s)等。,47,1.6.8 PatternSyntaxException类,这个类用于检查正则表达式模式中的语法错误,它提供了几个方法帮助查找错误,如:getDescription(),getIndex(),getPattern(),getMessage()等。,48,1.7 注解,注解(annotation)提供程序信息,可以是给编译器的信息,可以是编译时刻和部署时刻的处理,也可以是运行时刻的处理。注解是用符号引导的标识,可以加在类、域、方法和其他元素前面。,49,1.8 编译工具,Java源程序需要编译成字节码(bytecode)文件,即.class文件,然后由Java虚拟机(又叫解释器)运行。Sun公司免费提供了JDK(Java Development Toolkit),目前的版本是JDK 6,又有人称它为JDK1.6.0 。,50,1.9 平台环境,要运行Java程序,需要底层操作系统、虚拟机、类库和各种配置数据,构成平台环境。还可以安装其他公司也推出的Java集成开发环境,如IBM公司的Eclipse开发环境等。,51,1.9.1 PATH和CLASSPATH,如果在Windows平台开发Java,必须设置环境变量PATH和CLASSPATH。假如JDK安装在D:jdk6文件夹中,PATH变量后添加Djdk6bin(用分号隔开)。CLASSPATH的缺省值是“.”,表示当前目录。如果类在其他地方,比如在D:javalib,要加在CLASSPATH的“.”后(用分号隔开)。,52,1.9.2 编译与运行,在命令提示符窗口输入编译命令和解释命令,比如运行例1.1,在后输入: javac MyArray.java 编译成功后会生成一个MyArray.class文件,这就是所谓的字节码。现在可以用java解释器运行这个class,可以不键入class后缀。 java MyArray,53,1.9.3 命令行参数,Java语言支持命令行参数(command line argument),在用解释器执行应用程序时在命令行输入一些参数给程序,使用户可以影响应用程序的操作。 Java应用程序可以接受任何数量的命令行参数,它们跟在程序名后,用空格隔开,运行系统把命令行参数送到程序的main()方法的字符串数组String args中。,54,1.9.4 Eclipse开发环境,JDK的不足之处是要在命令提示符窗口输入命令,而人们更希望使用集成开发工具。本书推荐使用Eclipse,它是开放源代码的可扩展集成开发平台,可以很方便地开发Java软件,如果加入其他插件,它的功能会不断增加。 Eclipse可以在处下载,eclipse-jee-europa-fall2-win32用在Windows平台,安装它之前先要安装好JDK才行。,55,Java技术及其应用,第2章 面向对象结构,56,Java是真正面向对象的编程语言,它把所有的过程代码封装在类中,不再支持面向过程编程的方法。任何Java程序的框架就是类/接口的声明,本章将介绍类与接口这两种数据结构以及有关概念。,57,2.1 类,类与对象是面向对象结构的基本概念。所谓面向对象就是把现实世界的复杂事物抽象为一个个对象(object),每个对象有自己特有的状态(state)和行为(behavior),如电灯泡,状态有亮或灭,功率多少,电压多少等; 行为有开、关等。有共同状态和行为的许多对象称为一类(class),如白炽灯类,荧光灯类等。要改变某个对象的状态是通过发送消息(message)来实现的,如要开灯,必须按开关(发送开灯消息); 要灯变灭,必须重按开关(发送关灯消息)。,58,有共同特点的软件对象可以抽象成为一类,类中定义各对象共有的变量和方法,称为原型。由原型可以定义一个个具体的对象,称为实例。 由类产生实例的过程充分体现了类的可复用性。 类与对象之间既有区别又有联系: 对象是类的实例,类是有公共特性的对象的抽象。对象封装了变量和方法,其封装性可以实现软件的模块化和信息隐蔽 等软件工程设计原则,而类的可复用性则简化了软件设计的劳动。,2.1.1类与对象的关系,59,类的另外一个重要特性是继承性。若想创建一个新类, 可以在继承原类的大部分属性的基础上,再增加一部分新属性。用继承方法得到的新类称为原类的导出类(derived class)或叫子类(subclass),而原类对子类而言成为基类(base class)或叫超类(superclass)。子类通过变量声明继承超类的状态,通过方法声明继承超类的方法,并且可以重写所继承的方法,使之增加新的用途。,60,Java语言最重要的数据结构就是类,它是最基本的面向对象单元,是用于定义一组对象共同具有的状态和行为的模板(template)。类的形式如下: class declaration class body 其中class declaration是类声明部分,class body是类体部分,由一对花括号包含。,2.1.2 类构造,61,一般的类声明有如下几个部分: modifiers class ClassName extends SuperClassName implements InterfaceNames 其中方括号部分是可以缺省的。 modifiers部分称为修饰符,说明本类是abstract、final还是public。 ClassName是所声明的类名,必须是有效的Java标识符。 SuperClassName 是超类名,extends表明本类是从超类SuperClassName中派生而来的子类。 InterfaceNames 是多个接口名,implements表明本类实现(即使用)这些接口。,62,类体部分包含了类中支持的成员变量(member variables)和方法的声明。所谓成员变量是指与一个类或对象相关的变量,在类体中但不在方法体中,其作用域是整个类; 而在方法体中的变量称为局部变量(local variables),只在方法体内使用。 类的成员变量代表了类的状态,其方法实现了类的行为。一般先声明成员变量,然后给出方法的声明和实现。,63,Java为变量提供了四种级别的访问: private,protected,public和friendly。不同的限制符限制了同一个类中、同一个包中、子类中、不同包中访问变量的权限。,64,一般的方法声明格式为: accessSpecifier static abstract final native synchronized retern-type method_name(paramlist) throws exceptionsList,65,在声明方法名时要注意两点, 一是方法名重写和重载, 二是构造方法 ( constructor method)。 所谓构造方法是某个方法与声明它的类同名。如某个类名是text,类中声明了一个方法也叫text,则这个方法称为构造方法。构造方法有专门的用途,用于建立本类的一个新对象,并且对新对象进行初始化。,66,Java的对象是类的实例,一个类可以实例化创建许多对象,我们称对象的类为对象的类型。一个对象有自己的生命周期: 一是创建,二是使用,三是清除。,2.2 对象,67,2.2.1 对象的创建,Java提供了new运算符和构造方法用于创建对象,其格式如下: type objectName = new constructor(.); type是对象的类型,即对象的类或接口。 objectName是对象名,即引用对象的变量。 new运算符实例化一个新的对象。 constructor(.)用于初始化对象。,68,创建了对象后就可以使用对象中的变量和方法,在访问限制的允许下,用点运算符 “.“访问这些变量和方法。,2.2.2 对象的使用,69,Java语言并不要求程序员显式地清除不在需要的对象,程序员可以放心地创建对象,使用对象。Java运行系统自动判断对象是否在使用,用垃圾收集功能周期性地清除不再使用的对象,释放它们所占的资源。 Java中有一个结束方法finalize(),是在清除对象时自动被调用的方法。程序员可以利用它做一些结束工作,如关闭曾打开的文件等。,2.2.3 对象的清除,70,类的复用可以用合成与继承来实现,减轻人们重复设计类的劳动。,2.3 类的复用,71,合成(composition)是最简单的复用类的方法,只需把现有类的对象放入一个新类中,并给予适当的初始化就行了。初始化的地方可以在定义对象时,或在构造方法内,甚至在要用该对象的时候。,2.3.1 合成,72,继承是另一种复用类的方法,但必须知道原有类的代码,并在继承时加以改动,因此又称白盒复用。,2.3.2 继承,73,嵌套类(nested class)是Java的类的嵌套形式,一个类可以在另一个类中定义,如: class OuterClass . class NestedClass . ,2.4 嵌套类,74,静态嵌套类在外部类定义成员的地方定义,例如: class OuterClass . static class StaticNestedClass . ,2.4.1 静态嵌套类,75,内部类是非静态的嵌套类,不能定义自己的静态成员,内部类在外部类定义成员的地方定义,例如: class OuterClass . class InnerClass . ,2.4.2 内部类,76,局部内部类不是在外部类定义成员的地方定义,而是在某个方法体中定义的,如: class OuterClass void myMethod() class LocalInnerClass . ,2.4.3 局部内部类,77,2.4.4 匿名内部类,匿名内部类比局部内部类更隐蔽,它连名字都没有,如: public class OuterClass public Abc abc() return new Abc() /类定义开始 private int x=1; public int add() return +x; ; /匿名内部类结束 ,78,多态是面向对象编程的特色,一个方法可以有多种行为,比如例2.5中的Point3d类的distance()方法就有三种不同的求空间点距离的形式。多态与Java的方法重载、上转(upcasting)、下转(downcasting)等概念密切相关。,2.5 多态,79,类的继承性使程序员可以定义一个较抽象的超类,仅有一部分公共的行为,这部分代码可以通用。而把具体的不同行为放在各种子类,可以扩充超类的功能。利用这种强有力的机制可以组织和构造各种软件程序。,2.6 抽象类与接口,80,抽象类是用abstract修饰符在关键字class前面修饰的一种类,含抽象方法的类一定要声明抽象类,为这种类不能实例化,只能继承,目的是让子类对它进行改进。,2.6.1 抽象类,81,如果抽象类的方法全是抽象的,则称为接口。接口是Java的另一种重要的复合数据类型,是一组方法的定义和常量的集合。接口仅提供了方法的声明而没有提供方法的实现,而且不象抽象方法一样必须在继承树中的某个类中实现。它为相互没有关系的类的共同行为定义方法原型,然后由这些类分别实现这些行为。,2.6.2. 接口,82,由于Java取消了多继承,在类声明的extends后只有一个超类名,即只有单一继承。 为了使得一个类能继承多个类的属性,可以用接口来达到这个目的。 在接口声明的extends后面可以有多个接口名,即当前接口可以包含这些接口中的所有成员,相当于继承了多个类的属性。,83,引入泛型(generics)是Java SE5的重要改进,如果我们的代码可以与某种未指定的类型一起工作,我们就可以写出更通用的代码。例如,如果一个类里只接受整数类型,那么我们无法加入浮点类型。如果我们用Object类对象取代整数类型,那么编译器要经常判断当前对象实际是哪一种类型,这会很消耗时间。如果我们用某个未指定的类型T取代整数类型,实际使用时再代入具体类型,那么我们就可以处理多种类型的对象。,2.7 泛型,84,2.7.1 定义泛型类型,定义泛型类型时用尖括号包含一个单个大写字母代表的类型参数跟在类名后,常用的大写字母及其含义有: 1. E - 元素 2. K - 关键字 3. N - 数 4. T - 类型 5. V - 值 6. S,U,V等 - 第二, 第三, 第四种类型,85,2.7.2 限界类型参数,限界类型参数(Bounded Type Parameter)是限定可以取代类型参数的实际类型的范围。上面的Store没有限定用什么类型代替T,如果希望只能用水果类型Fruit及其子类取代T,可以用extends Fruit加在T后,如: public class Store 其中extends后面的类型是T的上界(upper bound)。,86,泛型中所用的任意字符(wildcard)用问号表示,代表某种未知类型,有无界任意字符(unbounded wildcard)、限界任意字符(bounded wildcard)、和下界任意字符(lower bound wildcard)三种用法。,2.7.3 任意字符,87,2.7.4 类型擦除,类型擦除(type erasure)是指编译器去掉类或方法中有关类型参数和类型变量的所有信息,目的是使得用了泛型的Java应用程序能够与未用泛型时创建的类库和应用程序保持兼容性。因此,在运行时刻,需要知道类型才能执行的运算无法对泛型类型进行运算。比如new运算、instanceof运算都无法执行。,88,2.8 枚举,枚举类型是一个类型的域中包含一组设定好的常数,比如一年四季可以用一个枚举类型来定义: public enum Season SPRING, SUMMER, AUTUMN, WINTER enum是关键字,Season是类型名,里面四个域是固定常量,所以都是大写字母。,89,2.9 包与版本识别,2.9.1 包 Java的包(package)是一组相关的类和接口,它有三种作用。,90,如果你希望把自己编写的类与接口放在一个包中,可以用 package 语句来定义一个包。格式如下: package pkgname; 该语句位于Java源文件(编译单元)的第一句, 指明下面声明的类与接口都位于pkgname包中。,91,Java编译器为所有程序自动引入java.lang包,所以编程时不必引入它, 但其他包都要用import语句引入。一个Java源文件中可以有多个import语句,表明它引入了多个包。,92,2.9.2 版本识别,每个Java包由class文件和可选的源文件组成,用于识别包的内容的信息与包内容存放在一起。,93,Java技术及其应用,第3章 基本I/O,94,流是一串有顺序流动的字符,用流作为数据处理模式可以独立于操作系统,只从编程语言的角度来使用,而不管流的起点(source)和终点(destination)是什么。程序从附在起点的流中读入一串字符得到输入数据,而输出一串字符到附在终点的流中产生输出数据,这种数据流的概念组成了Java的I/O系统。支持Java I/O的包有java.io和java.nio,Java的I/O从字节流(byte streams)发展到字符流(character streams),最后来又增加了新I/O以提高速度。,95,3.1 文件访问,文件访问是输入输出的基础,java.io包有些类和接口与文件有关,96,File类是一个重要的文件操作和管理工具,它提供了一套独立于操作系统的方法,使用户能访问文件系统中的文件与目录信息。,3.1.1 File类,97,要注意的是File类对象不是文件,而只是用于存放文件或目录的引用(reference)。 创建了File类对象,就可以调用File类的各种方法来得到文件和目录信息。,98,这是一个很有价值的访问文件的类,它既可以读文件,又可以写文件,还可以任意地访问文件的任何地方。下一节字节流中的文件输入输出流是按顺序来访问文件的,所以RandomAccessFile有更高的灵活性。,3.1.2 RandomAccessFile类,99,Java的java.io包内有两个类InputStream和OutputStream,支持字节流(byte stream)的输入输出。,3.2 字节流,100, FileInputStream PipedInputStream FilterInputStream InputStream ByteArrayInputStream SequenceInputStream StringBufferInputStream,3.2.1 InputStream及其子类,101, FileOutputStream OutputStream PipedOutputStream FilterOutputStream ByteArrayOutputStream,3.2.2 OutputStream及其子类,102,数据流(data stream)支持基本数据类型(boolean, char, byte, short, int, long, float, double)和字符串值的二进制I/O,这些数据流实现了DataInput接口和DataOutput接口,前者描述可以用与机器无关的格式读Java基本类型数据的流,后者描述可以用与机器无关的格式写Java基本类型数据的流。,3.2.3 数据流,103,3.2.4 对象流,Java的字节流中新增了ObjectInputStream和ObjectOutputStream,可以创建对象流(object stream)支持对象的输入输出。能够序列化的对象才可以形成对象流。,104,序列化(serialize)一个对象是指将它的状态按某种方式转为字节流,使得该字节流以后能还原为对象的拷贝。如果一个Java对象的类或它的超类实现了java.io.Serializable接口或其子接口java.io.Externalizable,该对象就可以序列化。反序列化(deserialization)是将序列化形式的对象还原回该对象的拷贝的过程。,3.2.5 对象序列化,105,字符流(character stream)是以字符为单位读写数据的输入/输出流,Java平台采用16位的Unicode字符集处理字符,既可以和8位的ASCII码兼容,又可以满足国际化各种文字的需要,比如中文处理等。字符流是由Reader/Writer类及其子类对象产生的。,3.3 字符流,106,Reader类是读字符流的抽象类,它的子类有BufferedReader,CharArrayReader,FilterReader,InputStreamReader,PipedReader,StringReader等,它们重写了Reader类的某些方法,提供更多功能和更高效率。,3.3.1 Reader类及其子类,107,Writer类是写字符流的抽象类,它的子类有BufferedWriter,CharArrayWriter,FilterWriter,OutputStreamWriter,PipedWriter,PrintWriter,StringWriter等,各子类重写了Writer类的某些方法,提供更多功能和更高效率。,3.3.2 Writer类及其子类,108,java.nio包提供了新的I/O功能,主要是定义缓冲器(buffer)装数据,并提供通道(channel)连接执行I/O操作的实体以提高输入输出速度。可以理解为缓冲器装满数据,沿通道快速输入输出。nio包还有Charsets类用于编码与译码,有Selector类用于选择多路非阻塞I/O操作。,3.4 新I/O,109,Buffer类是一个容器,用于存放指定的基本类型数据。Buffer类有位置(position)指示,指向下一个读写元素。Buffer类有界限(limit)指示,指向第一个不能读写的地方。Buffer类定义了许多方法调整位置。,3.4.1 Buffer类,110,通道表示开放连接到可以执行I/O操作的实体,如硬件设备、文件、网络套接口(socket),或程序组件,它们可以执行不同的I/O操作,比如读或写。通道可以开放或关闭,可以安全地多线程访问。,3.4.2 Channel接口,111,输入输出经常包括读入人们喜欢的格式化数据,并按人们的习惯输出数据。java.util包提供了scanner API把输入分解成与数据有联系的标记,并提供了formatting API组装数据成为人们容易读的好格式。,3.5扫描输入与格式化输出,112,Scanner类对象适用于将格式化输入分解为标记,并按它们的数据类型解释单个标记。Scanner类用分界符(delimiter)模式来分解输入,默认的分界符是空白符,如空格、制表符、行终止符等。要用不同的分界符,调用useDelimiter()方法,参数用正则表达式。,3.5.1 Scanner类,113,3.5.2 Formatter类,Formatter类提供类似C语言printf()风格的格式化输出解释,它的format()方法与C语言的printf()方法几乎一样,但Java的格式化比C语言严格。Java在PrintStream类里也提供了一个与C语言同名的printf()方法,目的是使C语言程序员有熟悉的感觉。下例说明Java的format()与printf()是等价的。,114,国际化是设计应用程序使其适应于各种语言和地区而不必在工程上修改的过程,国际化程序的特征是:加上当地的数据后可以在世界各地运行;文本元素不硬编码在程序中,而是存在源代码外并动态存取;支持新语言,不用重编码;与文化有关的数据以符合用户地区和语言的格式出现;可以很快本地化。,3.6 国际化,115,java.util.zip包提供了类用于读和写标准的ZIP和GZIP文件格式,java.util.jar包提供了类用于读和写JAR(Java文档)文件格式,该格式基于标准的ZIP文件格式,并带一个清单文件(manifest)。这些文件都是Java支持的压缩文件。,3.7 压缩文件,116,要创建ZIP文件,必须用java.util.zip包ZipOutputStream类来创建,该类可以把多个输出文件流转换为ZIP文件夹中的一个个压缩项。读入ZIP文件要用ZipInputStream类,转换成普通的文件流。,3.7.1 ZIP文件,117,JAR文件也像ZIP文件一样把多个文件压缩到一个文件中,它的目的是让应用程序和小应用程序的class文件和相关的辅助资源文件包在一起容易传输。JAR文件的优点是具有可移植性。,3.7.2 JAR文件,118,Java技术及其应用,第4章 增强性能类,119,Java有很多类是用于提高性能、异常处理、监控与管理的,本章将介绍Java的这些增强性能类。,120,4.1 异常处理,Java语言采用“异常(exception)“来为其程序提供错误处理能力,异常是一个事件,当执行中的程序中断其正常的指令流时出现。Java代码能检测出错误,向运行系统指明是什么错误,抛出一个异常。通常,抛出的事件使线程终止,显示其错误信息。如果我们想自己处理异常,可以用一个catch语句捕捉异常。,121,异常实际上是异常事件的简称,许多不同的错误可以引起异常。有硬件错误,如硬盘坏了;有编程错误,如试图访问越界数组元素。若这些错误出现在Java的方法中,该方法创建一个异常对象,对象中包含异常类型、错误出现时程序的状态等信息,交到运行系统,这叫抛出一个异常。,4.1.1 异常,122,Java语言要求各方法捕捉或声明(declare) 在方法的作用范围内可能抛出的所有非运行时刻 (non-runtime) 异常,如果编译器检查到某个方法没有满足要求,它会显示出错信息,并拒绝编译程序。,4.1.2 捕捉与声明的要求,123,异常可分为非运行时刻异常和运行时刻异常(runtime exception),后者是出现在Java运行系统中的异常,包括算术异常(如被零除),指针异常(如试图通过null引用访问对象)和下标异常(如用太大或太小的下标访问数组元素)等。运行时刻异常在程序中到处可出现,数量很多,检查它们所花的代价超过了捕捉与声明带来的好处,因此编译器不要求我们捕捉或声明运行时刻异常。,124,建造一个异常处理器处理异常,由三个部分组成:try块,catch块和finally块。,4.1.3 处理异常,125,如果我们的方法不想处理异常,那就要把它抛出。任何Java代码都可以抛出异常,如我们的代码,包中别人写的代码,以至Java运行系统。在方法的throws子句部分给出一个throwable对象。,4.1.4 抛出异常,126,编写自己的异常类时,若它从Exception类派生而来,则用“Exception“作类名的结尾,若从Error类派生而来,则名字后加“Error“。,4.1.5 创建自己的Exception类,127,并发(concurrency)机制支持程序员写可以同时执行多个任务的应用程序,Java平台的编程语言和类库都支持基本并发机制,5.0版本以上加入了高层的并发API。在Java 编程语言中,并发编程主要与线程(thread)有关。,4.2 并发,128,4.2.1线程,线程是程序中单个顺序控制流,有时又称为执行上下文 (execution context)或轻量级进程(lightweight process)。线程有起点,终点和顺序,但它不能独立运行,而要在程序中运行。Java的重要优点之一是它可以在一个程序中同时运行多个执行不同任务的线程,避免了在单线程的情况下一个任务未完就不能执行另一个任务的现象。,129,Java语言从最基本的Object类开始就提供了实现线程同步的机制,如notify(),notifyAll(),wait()等方法。为了防止竞争资源,Java通过调用synchronized方法进行监视, 用它锁定某个对象,同一时刻只有一个线程可以取用这个资源,这样就可以解决竞争问题。没有资源的互斥访问,线程同步也就无从谈起。,4.2.2 同步与锁定,130,反射(reflection)通常用于使程序有能力检查或修改在Java虚拟机上运行的应用程序,由于它功能强,需要熟练掌握Java技术,又可能带来一些副作用,所以初学者能够不用反射就不用。,4.3 反射,131,Class类提供一些方法可以检查对象的运行时刻的属性,包括对象的成员和类型信息。Cla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多功能旋转隐藏式收纳桌创新创业项目商业计划书
- 室外庭院垃圾回收系统创新创业项目商业计划书
- 现代教育技术与学科融合讲座稿
- 中学英语语法专项巩固练习题
- 七年级英语易错重点题集解析
- 新版小学英语教案资源包
- 暖通工程招投标技术标范本解读
- 深度学习技术应用心得体会
- 2025年电功及电功率试卷及答案
- 施工现场安全监督管理办法
- 儿童功能性便秘(FC)诊断与治疗
- 物流车辆动态安全监控操作规程
- 煤矿企业无人值守机房站所管理规范与制度汇编
- 2025中国电气装备许继集团许继电气校园招聘笔试历年参考题库附带答案详解
- 高中语文高考语文复习+高考中的成语考查+课件
- (2025年)公安机关人民警察高级执法资格考试题及答案
- 2025甘肃庆阳正宁县公安局招聘警务辅助人员40人备考考试题库附答案解析
- 2025年医疗设备管控系统项目市场调查、数据监测研究报告
- 七年级历史上学期期末选择题100题-附答案解答
- 兼职外贸合作合同范本
- 2025年安庆职业技术学院第二批公开招聘工作人员12人考试参考试题及答案解析
评论
0/150
提交评论