基于文本的应用教学.ppt

上传人:小飞机 文档编号:6262547 上传时间:2023-10-11 格式:PPT 页数:75 大小:344.82KB
返回 下载 相关 举报
基于文本的应用教学.ppt_第1页
第1页 / 共75页
基于文本的应用教学.ppt_第2页
第2页 / 共75页
基于文本的应用教学.ppt_第3页
第3页 / 共75页
基于文本的应用教学.ppt_第4页
第4页 / 共75页
基于文本的应用教学.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《基于文本的应用教学.ppt》由会员分享,可在线阅读,更多相关《基于文本的应用教学.ppt(75页珍藏版)》请在三一办公上搜索。

1、第十课:基于文本的应用,周甫,学习目标,学习目标,1 程序交互的几种方式,程序在运行的时候,我们要给程序输入数据,程序根据输入的数据作出响应。常见的输入方式有:命令行参数系统属性标准的输入从文件读入,实例分析 1,问题的描述:通过命令行参数给程序输入数据解决方案:当一个Java应用程序从终端启动时,用户可以提供零个或多个命令行参数。这些命令行参数都是字符串,这些字符串可以是独立的记号(如:arg1),也可以是引号之间的多个符号(another arg)。参数序列跟在程序类的名字后面输入;然后被存放在String 对象的数组中,传递给main 方法。,实例分析 1(续一),代码如下:class

2、TestArgs public static void main(String args)for(int i=0;i args.length;i+)System.out.println(argsi);,实例分析 1(续二),结果,实例分析 2,问题描述:通过系统属性给程序传入数据解决方案:系统属性是另外一种在运行时向程序传递参数的机制。每个属性都是一个属性名和属性值的映射对。属性名和属性值都是字符串。Properties 类表示这样的映射。System.getProperties方法返回系统的属性对象。System.getProperties(String)方法返回String属性的值。Sys

3、tem.getProperties(String,String)方法允许你在属性名不存在时返回默认值。你可以使用递归调用PropertyNames方法遍历全部属性名的集合;对每个属性名调用getProperty方法得到所有属性的值。,实例分析 2(续一),代码如下:import java.util.*;class TestSP/System Properties public static void main(String args)Properties p=System.getProperties();/第4行Enumeration e=p.propertyNames();/第5行while

4、(e.hasMoreElements()String name=(String)e.nextElement();if(name.equals(aaa)String value=p.getProperty(name);System.out.println(name:+name+value:+value);分析:第4行取得系统属性的集合,第5行从属性集合中得到属性名的枚举.,实例分析 2(续二),结果:运行:java-Daaa=345 TestSP/-D后面是属性的名字,=后面是属性的值,注意是大写的D,实例分析 3,问题描述:标准的输入解决方案:多数应用都会发生人机交互。人机交互经常通过控制台文

5、本输入/输出来完成。Java 2 SDK 用公有类支持控制台I/O。System.out是一个PrintStream对象,它指向运行Java应用程序的终端窗口。System.in是一个InputStream对象,它指向用户的键盘。,实例分析 3(续一),代码:importjava.io.*;classTestKI/Keyboard Inputpublic static void main(String args)Strings;/进行字符串的包装,就可以读取一行字符串InputStreamReader isr=new InputStreamReader(System.in);BufferedR

6、eader br=new BufferedReader(isr);(按 ctrl+c 键或者输入exit 退出程序!);,实例分析 3(续二),trys=br.readLine();while(s!=null,实例分析 3(续三),运行:,实例分析 4,问题的描述:在程序中实现文件的创建,读,写解决方案:Input/Output(I/O)是程序中最重要的元素之一。Java技术包含了一套丰富的I/O流。这一节我们要讲解文件中字符数据的读写。我们将讲述:创建文件对象。操作文件对象。读写文件流。,实例分析 4(续一),创建一个新的File对象File类提供了若干处理文件和获取它们基本信息的方法。在j

7、ava技术中,目录也是一个文件。你可以创建一个代表目录的文件,然后用它定义另一个文件:File myFile;myFile=new File(FileName);myFile=new File(/,FileName);File myDir=new File(/);myFile=new File(myDir,FileName);*,实例分析 4(续二),文件测试和工具 当你创建一个File对象后,你可以使用下面任何一种方法来获取有关文件的信息:文件名:String getName()String getPath()String getAbsolutePath()String getParent(

8、)boolean renameTo(File newName)目录工具:boolean mkdir()String list(),实例分析 4(续三),文件测试:boolean exists()boolean canWrite()boolean canRead()boolean isFile()boolean isDirectory()boolean isAbsolute()通用文件信息和工具:long lastModified()long length()boolean delete(),实例分析 4(续四),代码:import java.io.*;class TestReader publ

9、ic static void main(String args)/读取当前目录下的,该类的原文件File f=new File(TestReader.java);/输出到当前目录下的out.java,系统会自动创建该文件File f1=new File(out.java);FileReader fr=null;FileWriter fw=null;BufferedReader br=null;PrintWriter pw=null;,实例分析 4(续五),tryfr=new FileReader(f);br=new BufferedReader(fr);fw=new FileWriter(f1

10、);pw=new PrintWriter(fw,true);/true 代表自动刷新到磁盘里String ss=br.readLine();while(ss!=null,实例分析 4(续六),finally/不管发生不发生异常,都要进行IO流的关闭try/防止发生空指针异常,也就是说在创建文件IO流之前发生异常。if(br!=null)br.close();if(pw!=null)pw.close();catch(Exception e)e.printStackTrace();/以上是关闭IO流最完整的代码,实例分析 5,问题的描述:通过控制台写数据到文件里解决方案:1,建立控制台的输入流2,

11、建立文件的输出流,实例分析 5(续一),代码如下:import java.io.*;classTestKWFpublic static void main(String args)File file=new File(keyout.java);BufferedReader br=null;/要习惯性的给声明的引用类型变量初始化为nullPrintWriterpw=null;,实例分析 5(续二),trybr=new BufferedReader(new InputStreamReader(System.in);pw=new PrintWriter(new FileWriter(file);(按

12、 ctrl+c 键 或者输入exit 退出程序!);Strings=null;s=br.readLine();/如果按 ctrl+c 键,那么s=null,所以要先进行s!=null判断,不然/会出现空指针异常(调用s.equals(exit))while(s!=null,实例分析 5(续三),catch(IOException e)e.printStackTrace();finallytryif(br!=null)br.close();if(pw!=null)pw.close();catch(Exception e)e.printStackTrace();,2 Math类,Math类是用来支

13、持数学计算的,它打包在java.lang包中,包含一组静态方法和两个常数,是终态(final)的,它不能被实例化。它主要包括下列方法:分割 int ceil(double d):返回不小于d的最小整数。int floor(double d):返回不大于d的最大整数。int round(float f):返回最接近f的整数(int)。long round(double d):返回最接近d的整数(long)。,2 Math类(续一),极值、绝对值:double abs(double d):返回d的绝对值。对于float,int,long有类似的函数。double min(double d1,dou

14、ble d2):返回d1与d2中的小者.对于float,int,long有类似的函数。double max(double d1,double d2):返回d1与d2中的大者。对于float,int,long有类似的函数。三角函数:double sin(double d):返回d正弦。对于余弦和正切有类似的函数cosine,tangent。double asin(double d):返回d反正弦。对于反余弦和反正切有类似的函数acos,atan。double toDegrees(double r):将弧度换算成度。double toRadians(double d):将度换算成弧度。,2 Mat

15、h类(续二),对数、指数 double log(double d):返回d的自然对数。double exp(double d):返回以e为底的指数。其它函数 double sqrt(double d):返回d的平方根。double pow(double d1,double d2):返回d1的d2次幂。double random():返回0 至 1 的随机数。常数 PI:圆周率,double。E:自然对数的底,double.,课堂练习,比较2个随机数的大小。要求:分别比较整数,单精度浮点数和双精度浮点数。,3 String的方法,String concat(String s):返回一个新的Str

16、ing,即,在原来的String后面追加上s。String replace(String old,String new):返回一个新的String,将原来的String中的old替换成new。String substring(int start,int end):返回一个新的String,它是原来的String中从start到end的一部分。String toLowerCase():返回一个新的String,它将原来的String中的大写字母变成小写。String toUpperCase():返回一个新的String,它将原来的String中的小写字母变成大写。,3 String的方法(续一)

17、,查找方法:boolean endsWith(String s):如果原来的String以s为结尾,则返回true。boolean startsWith(String s):如果原来的String以s为开始,则返回true。int indexOf(String s):返回String中第一次出现s偏移量。类似有lastindexOf,从串尾开始查找。int indexOf(int ch):返回String中第一次出现ch偏移量。类似有lastindexOf,从串尾开始查找。int indexOf(String s,int offset):返回String中从offset开始查找,第一次出现s的

18、偏移量。类似有lastindexOf,从串尾开始查找。int indexOf(int ch,int offset)返回String中从offset开始查找,第一次出现ch的偏移量。类似有lastindexOf,从串尾开始查找。,3 String的方法(续二),比较方法:boolean equals(String s):如果原String与s逐字符比较都相等,则返回true。boolean equalsIgnoreCase(String s):如果在忽略大小写的情况下,原String与s逐字符比较都相等,则返回true。int compareTo(String s):进行词汇比较,如果原Stri

19、ng 小于s则返回负数;如果原String 大于s则返回正数;如果原String 等于s则返回零。其它方法:char charAt(int index):返回index处的字符。int length():返回String的长度。,4 StringBuffer类,StringBuffer对象是一个可以改变的统一编码字符串。String与StringBuffer之间没有继承关系。构造函数StringBuffer():创建一个空的StringBuffer.StringBuffer(int capacity):创建一个空的StringBuffer,容量是capacity。StringBuffer(St

20、ring initialString):创建一个StringBuffer,其内容是initialString。,4 StringBuffer类(续一),修改方法StringBuffer append(String s):在原来的StringBuffer后面追加上s。对于下列参数类型有重载的方法:boolean,char,char,double,float,int,long,Object。StringBuffer insert(int offset,String s):在原来的StringBuffer的offset处插入s.对于下列参数类型有重载的方法:boolean,char,char,dou

21、ble,float,int,long,Object。StringBuffer reverse():颠倒原StringBuffer中字符的顺序.void setCharAt(int index,char ch):将StringBuffer中的index处设为ch。void setlength(int newLength):设定StringBuffer的长度.*,5 StringBuffer与String的区别,主要是效率上的区别。它们都可以表示一个字符串对象,只不过String类型的字符串对象,只要值改变,存储的空间也会改变,而StringBuffer是在原来的空间上进行修改的。所以要进行大量的

22、字符串操作,要用StringBuffer.而如果不是频繁操作字符串对象,两者都可以,只不过String 更方便些,因为用两个双引号就可以表示一个Sting对象。,实例分析 6,问题的描述:String 类的使用解决方案:String 对象是一个不可变的统一编码字符串。该类是JDK中最特殊的一个类。只要一个String对象值改变,系统会在内存堆里寻找新的空间来存放改变后的值。,实例分析 6(续一),代码分析:class TestStringpublic static void main(String args)String s1=abc;String s2=abc;/在内存中只生成了一个对象。/

23、*如果 String s2=new String(abc);会在内存中再生成一个abc对象那么将第一次将输出!=如果要想输出=把(s1=s2)改成(s1.equals(s2)=只能判断基本类型的值和引用类型的地址相等不相等equals方法可以判断引用类型的值相等不相等。*/if(s1=s2)/地址相等的判断(=);else(!=);,实例分析 6(续二),s2=s2+d;/改变对象abc的值if(s1=s2)/地址相等的判断,如果输出!=说明s2的地址改变了。(=);else(!=);编译和运行的结果为:=!=,6 集合类的使用,收集API收集(或容器)是代表一个对象组的单个对象,其它对象被认

24、为是它的元素。收集用于处理多种类型对象的问题,所有的类型都有一个特殊的种类(也就是说,它们都是从一个共同父类继承来的)。Java编程语言支持收集类Vector,Bits,Stack,Hashtable,LinkedList等等。例如,Stack实现后进先出(LIFO)的顺序,Hashtable提供一个相关的对象数组。收集可用于保存,处理Object类型的对象。这允许在收集中贮存任何对象。它还可以,在使用对象前、从收集中检索到它之后,使用正确的类型转换为我们所需要的对象类型。,6 集合类的使用(续一),收集API典型地由将对象保持为下述情况的接口而组成:(Collection)收集-没有具体顺序

25、的一组对象(Set)设定-没有复制的一组对象(List)列表-有序对象组,允许复制API还包括诸如HashSet,ArraySet,ArrayList,LinkedList和Vector等等的类,它们实现这些接口。API还提供了支持某些算法的方法,如:排序,二进制搜索,计算列表中的最小和最大等。,6 集合类的使用(续二),Collections API的体系结构集合是代表一组对象的单个对象。集合中的对象叫元素。我们在程序设计中经常会用到各种各样的数据结构,如:表、映射、清单、树、集合等。显然,这些数据结构都满足集合的定义。为了方便我们处理各种各样的数据结构,Java在Java.util包中提供

26、了一组API。这组API中的大部分类都实现了Collection接口,因此,被称作Collections API。根据它们处理的不同种类的数据结构,Collections API可分为三类:Collection:一组没有顺序的对象,允许重复相同的元素.Set:一组没有顺序的对象,不允许重复相同的元素.List:一组有顺序的对象,允许重复相同的元素.,6 集合类的使用(续三),Collections API包括诸如HashSet,ArraySet,ArrayList,LinkedList和Vector等等的类。Collections API支持常用算法:排序,二进制搜索,求最小值和最大值等等。C

27、ollection接口和类的体系结构有助于我们理解Collections API,实例分析 7,问题的描述:Set容器的使用解决方案:在下面的例题中,程序声明了一个Collections API的Set 型对象,并且用它的子类HashSet初始化它。然后向Set中添加元素,打印结果。,实例分析 7(续一),代码分析:importjava.util.*;public class TestSetpublic static void main(String args)Set set=new HashSet();set.add(abc);set.add(abd);set.add(abe);set.ad

28、d(new Integer(4);set.add(abe);/插入了相同的数据,所以会失败set.add(new Integer(4);/同上System.out.println(set);,实例分析 7(续二),编译和运行的结果为:4,abd,abc,abe从结果可以看出Set容器的特点:不能保存重复的数据,而且保存的是无序的数据.请思考下面的问题:这里的重复数据是根据什么判断两个数据是否是同一个数据?是由对象的hashCode()和equals()方法共同决定的。请看下例:,实例分析 7(续三),import java.util.*;class TestSet1public static

29、void main(String args)HashSet hs=new HashSet();/保存了10个数据for(int i=0;i 10;i+)hs.add(new Data();/只打印一个数据,如果Data没有覆盖其中一个方法,那么会输出10个数据System.out.println(hs);,实例分析 7(续四),class Data/覆盖hashCode()方法,得到一样的hashcodepublic int hashCode()return 12;/覆盖equals()方法,是每个对象比较相等public boolean equals(Object o)return true

30、;输出结果为:Datac,实例分析 8,问题的描述:List 容器的使用解决方案:在下面的例题中,程序声明了一个Collections API的List 型对象,并且用它的子类ArrayList初始化它。然后向List中添加元素,打印结果。注意:List允许重复的元素。,实例分析 8(续一),代码分析:import java.util.*;class TestList public static void main(String args)/建立一个List类型的容器List al=new ArrayList();/放11个数据,其中有重复的for(int k=0;k 10;k+)al.add

31、(abc+k);al.add(abc+4);/打印出容器里的数据System.out.println(al);编译和运行的结果为:abc0,abc1,abc2,abc3,abc4,abc5,abc6,abc7,abc8,abc9,abc4从结果可以看到List容器的特点:有序的数据,可重复的数据,实例分析 9,问题的描述:迭代器的用法解决方案:可以用迭代扫描一个集合。基本的Iterator接口可以向前扫描任何集合。对于一个Set来说,它的迭代是没有顺序的。对于一个List来说,它的迭代的顺序与List中元素的顺序相同,只能向前,不能后退。此外,List对象还支持ListIterator接口,允

32、许迭代向后移动。,实例分析 9(续一),代码分析:Import java.util.*;public class TestList2public static void main(String args)Listlist=new ArrayList();list.add(one);list.add(second);list.add(third);list.add(new Integer(4);list.add(new Float(5.0F);list.add(second);/truelist.add(new Integer(4);/true/使用迭代器,来迭代容器里的所以数据,我们把Iter

33、ator叫做迭代器Iterator iterator=list.iterator();while(iterator.hasNext()System.out.println(iterator.next();,实例分析 9(续二),运行结果:onesecondthird45.0second4 上面例子只用了Iterator,这种迭代器只能向后迭代容器里的数据,有时候需要向前迭代数据,那么就的用ListIterator(列表迭代器),它可以前后滚动容器里的数据。请看下面的例子:,实例分析 9(续三),Import java.util.*;public class TestList3 public s

34、tatic void main(String args)List list=new ArrayList();list.add(one);list.add(second);list.add(third);list.add(new Integer(4);list.add(new Float(5.0F);list.add(second);/truelist.add(new Integer(4);/trueListIterator iterator=list.listIterator();(向下迭代容器里的数据:);while(iterator.hasNext()System.out.println(

35、iterator.next();(向上迭代容器里的数据:);while(iterator.hasPrevious()System.out.println(iterator.previous();,实例分析 9(续四),输出结果为:向下迭代容器里的数据:onesecondthird45.0second4向上迭代容器里的数据:4second5.04thirdsecondone,实例分析 9(续五),用迭代器还可以修改容器里的数据,只不过只能用当前的迭代器修改,不能两个迭代器同时修改一个容器里的数据!请看下面示例:public class TestList4public static voidmai

36、n(String args)Listlist=new ArrayList();list.add(one);list.add(second);list.add(third);list.add(new Integer(4);list.add(new Float(5.0F);list.add(second);/truelist.add(new Integer(4);/true,实例分析 9(续六),ListIterator listIterator=list.listIterator();Iterator iterator=null;iterator=list.iterator();iterator

37、.next();iterator.remove();/会删除该next()返回的元素。/用另个迭代器操作上一个迭代器改变后的数据while(listIterator.hasNext()System.out.println(listIterator.next();会发生如下异常:,实例分析 10,问题的描述:映射(Maps)的用法解决方案:映射这种数据结构含有两个部分:关键字和值。对于每个关键字都有一个值,也就是说,一个关键字映射一个值。映射允许通过关键字访问数据结构。Java 在Collections API的Map接口中声明了一对一的映射。当向映射中插入一对关键字和值时,如果出现关键字重用,

38、则用新值替换映射中原有的值,不在映射中增加一个元素。,实例分析 10(续一),代码分析:import;import;public class TestMappublic static void main(String args)Mapmap=new HashMap();map.put(abc,new Integer(5);map.put(abd,new Integer(6);map.put(abf,new Integer(7);/会覆盖原来的值7map.put(abf,new Integer(8);System.out.println(map.get(abf);编译和运行的结果为:8,实例分析

39、 10(续二),在应用中可以把该容器里关键字单独取出来放到一个实现Set接口的容器里,然后过滤出你所需要的关键字,然后根据这个关键字把对应的值取出来。import;importjava.util.*;public classTestMap1public static voidmain(String args)Map map=new HashMap();map.put(abc,new Integer(5);map.put(abd,new Integer(6);map.put(abf,new Integer(7);map.put(abf,new Integer(8);,实例分析 10(续三),/得

40、到关键字的集合Set s=map.keySet();Iterator i=s.iterator();String str=null;while(i.hasNext()str=(String)i.next();if(str.equals(abf)System.out.println(map.get(str);结果还是8注意:这里的关键字对象还是由hashCode()和equals()方法共同决定的.,实例分析 11,问题的描述:排序的用法解决方案:对于复杂的应用,尤其是生成报表时,排序是一种必不可少的基本操作。在Java 2 Collections API中,已经实现了几种排序。给数组排序可以使

41、用Arrays对象的一套sort方法。对于boolean以外的基本类型,Arrays.sort有两种变化:Arrays.sort(array)用来为整个数组排序。Arrays.sort(array,int fromIndex,int toIndex)用来为数组的一部分排序。,实例分析 11(续一),对于引用类型,Arrays.sort有四种种变化:Arrays.sort(Object array)用默认的比较器为整个数组排序。Arrays.sort(Object array,int fromIndex,int toIndex)用默认的比较器为数组的一部分排序。Arrays.sort(Objec

42、t array,Comparator comparator)为整个数组排序。Arrays.sort(Object array,int fromIndex,int toIndex,Comparator comparator)为数组的一部分排序。,实例分析 11(续二),由于排序算法必须比较两个对象,所以使用Arrays.sort方法时要传递比较器参数。比较器有两种类型:一种是实现Comparable接口的,另一种是实现Comparator接口的。Comparable接口定义了一个方法:int compareTo(element,Object)。这个方法比较 Object 与element。如果O

43、bject小于element,则返回负值;如果Object大于element,则返回正值;如果Object等于element,则返回零。,实例分析 11(续三),Comparator接口定义了两个方法:compare(e1:Object,e2:Object)int。如果e1小于e2,则返回负值;如果e1大于e2,则返回正值;如果e1等于e2,则返回零。equals(object:Object):boolean。用于判断两个比较器对象是否相等。该方法在继承Object类时已经被实现。,实例分析 11(续四),代码分析:import java.util.*;public class TestCom

44、pareable1 public static void main(String args)Cat c=new Cat5;for(int i=0;i c.length;i+)ci=new Cat(int)(Math.random()*100);/随机生成一个整数,作为猫对象的属性值,以区分不同的对象 System.out.println(ci);Arrays.sort(c);(-);for(int i=0;i c.length;i+)System.out.println(ci);,实例分析 11(续五),class Cat implements Comparableint w=0;public

45、 Cat(int i)w=i;public String toString()return Cat:+w;public int compareTo(Object o)Cat c=(Cat)o;if(this.w=c.w)/相等的话返回0 return 0;else if(this.w c.w)/大于的话返回正数 return 6;else return-3;/小于的话返回负数,实例分析 11(续六),输出结果如图,实例分析 11(续七),也可以定义动态的比较器,如下:import java.util.*;public class TestCompareable2 public static v

46、oid main(String args)Cat c=new Cat5;for(int i=0;i c.length;i+)ci=new Cat(int)(Math.random()*100);/随机生成一个整数,作为猫对象的属性值,以区分不同的对象System.out.println(ci);,实例分析 11(续八),Arrays.sort(c,new Comparator()/匿名类实现public int compare(Object o1,Object o2)Cat c1=(Cat)o1;Cat c2=(Cat)o2;if(c1.w c2.w)/如果大于的话返回正数return 4;e

47、lse if(c1.w c2.w)return-2;/小于的话返回负数elsereturn 0;/相等的话返回0,实例分析 11(续九),/*注意该接口还有一个方法叫 equals(Object o)方法在这里并没有实现,也会通过,原因是Object类也有那个方法所以每个类都有该方法。*/);(-);for(int i=0;i c.length;i+)System.out.println(ci);,实例分析 11(续十),class Cat int w=0;public Cat(int i)w=i;public String toString()return Cat:+w;,实例分析 11(续

48、十一),输出结果,一个重要工具:Properties,俗称属性对文件,大量应用于工程配置,其文件存放一般以xxxxx.properties为文件名后缀.Properties读取文件有多种途径,常用的借助于FileInputStream,如:FileInputStream fis=new FileInputStream(filename);Properties p=new Properties();p.load(fis);Properties以key-value的形式存放,读取一个value,给予key即可,如:p.getProperty(“key-name);,课堂练习:读取一个Properties,内容描述:读取一个Properties(person.properties),这个文件有2个key-value,分别是:name=zoofage=32请以上述值初始化一个Person类,并输出打印:Zoofs age is 32.*,独立实践,实践1 使用链表表示银行与客户的关系,以及客户与他的帐户的关系。实践2 为客户排序实践3 建立三个Person对象,保存在List中,然后将List的3个数据写入到一个文件(person.txt)中。要求:文件名及路径从config.properties中读取;filename=person.txtpath=d:study,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号