09基于文本的应用.doc_第1页
09基于文本的应用.doc_第2页
09基于文本的应用.doc_第3页
09基于文本的应用.doc_第4页
09基于文本的应用.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模块九 基于文本的应用模块九 基于文本的应用11. 命令行参数22. 系统属性22.1. 概述22.2. Properties Class23. 控制台I/O33.1. 写标准输出43.2. 读标准输入44. 文件I/O54.1. 创建一个新的File对象54.2. 文件测试和工具54.3. 文件流I/O64.4. 文件输出65. 数学类76. 第六节String类86.1. 创建新String的方法86.2. 查找方法86.3. 比较方法86.4. 其它方法87. StringBuffer类97.1. 构造函数97.2. 修改方法98. 收集API98.1. Collections API的体系结构98.2. A Set Example108.3. A List Example118.4. 迭代(Iterators)118.5. 映射(Maps)128.6. 排序(sorting)139. 使用javadoc工具159.1. 文档标签159.2. 使用jar工具1610. 练习1610.1. 写一个带行号的文件1610.2. 显示目录中的内容清单1710.3. 使用收集1710.4. 为客户排序17本模块阐述命令行参数、文件读写、使用收集、文档工具等。完成本模块的学习后,你应该能够: 在你的程序中使用命令行参数和系统属性。 使用标准输入。 在你的程序中实现文件创建、读、写。 使用集合、列表。 使用迭代方法遍历一个收集。 对数组和列表排序。 使用javadoc和jar工具。1. 命令行参数当一个Java应用程序从终端启动时,用户可以提供零个或多个命令行参数。这些命令行参数都是字符串,这些字符串可以是独立的记号(如:arg1),也可以是引号之间的多个符号(“another arg”)。参数序列跟在程序类的名字后面输入;然后被存放在String 对象的数组中,传递给main 方法。例如:publicclassTestArgspublic static void main(String args)for(int i=0; iargs.length; i+)System.out.println(“args” + i + “) is ” + argsi + “”);这个程序显示每个从命令行传递给TestArgs 程序的参数。Java TestArgs arg1 arg2 “another arg”2. 系统属性2.1. 概述系统属性是另外一种在运行时向程序传递参数的机制。每个属性都是一个属性名和属性值的映射对。属性名和属性值都是字符串。Properties 类表示这样的映射。System.getProperties方法返回系统的属性对象。System.getProperties(String)方法返回String属性的值。System.getProperties(String, String)方法允许你在属性名不存在时返回默认值。在包装类中有静态方法完成属性值的转换:Boolean.getBoolean(String)Integer.getInteger (String)Long.getLong(String)其中参数String是属性的名字。如果属性不存在,则返回false或null。2.2. Properties ClassProperties对象中包含一个属性名和属性值的映射。有两种方法可以取得属性值:System.getProperties(String)方法返回属性的值。System.getProperties(String1, String)方法允许你在属性名(String1)不存在时返回默认值(String2)。你可以使用递归调用PropertyNames方法遍历全部属性名的集合;对每个属性名调用getProperty方法得到所有属性的值。最后,属性集合可以调用store和load方法,从I/O流中保存或提取。下面的程序列出了程序运行时的全部属性:importjava.util.Properties;importjava.util.Enumeration;public classTestPropertiespublic static voidmain(String args)Propertiesprops = System.getProperties();Enumerationprop_names = pertyName();While(prop_names.hasMoreElements( ) )Stringprop_name = (String) prop_names.nextElement();Stringproperty = props.getProperty(prop_name);System.out.println(“property ” + prop_name + “ is ” + property + “”);第六行取得系统属性的集合,第七行从属性集合中得到属性名的枚举。枚举对象允许程序循环遍历其中的所有元素。这一点与迭代相似。HasMoreElements 方法判断枚举中是否还有后续元素,nextElement方法返回枚举中的下一个元素。运行:java DmyProp=theValue TestProperties输出结果摘录如下:property java.vm.vertion is 1.2.2property piler is NONEproperty path.separator is :property file.separator is /property user.home is /home/bashamproperty java.specification.vendor is Sun Microsystems Incproperty user.language is enproperty is bashamproperty myProp is theValue3. 控制台I/O多数应用都会发生人机交互。人机交互经常通过控制台文本输入/输出来完成。Java 2 SDK 用公有类java.lang.System支持控制台I/O。System.out是一个PrintStream对象,它指向运行Java应用程序的终端窗口。System.in是一个InputStream对象,它指向用户的键盘。System.err是一个PrintStream对象,它指向运行Java应用程序的终端窗口。3.1. 写标准输出我们已经多次使用System.out.println(String)方法写标准输出。这个PrintStream方法将参数字符串打印在控制台上,并且在参数字符串的末尾追加一个换行符。下面这些方法也支持打印其它类型:基本类型,字符缓冲区,任意的对象。所有这些方法都在末尾追加一个换行符。Void println(boolean)Void println(char)Void println(double)Void println(float)Void println(int)Void println(long)Void println(char )Void println(object)还有一套叫做print的方法,不在末尾追加换行符。3.2. 读标准输入下面的例子显示了如何从标准控制台读入String 信息:importjava.io.*;public classKeyboardInputpublic static voidmain(String args)Strings;/Create a buffered reader to read each line from the keyboard.InputStreamReaderir = new InputStreamReader(System.in);BufferedReaderin = new BufferedReader(ir);System.out.println(“Type ctrl-d or ctrl-c to exit.”);trys = in.readLine( );while( s != null )System.out.println(“Read: “ + s);s = in.readLine();in.close();catch(IOException e)e.printStackTrace();4. 文件I/OInput/Output(I/O)是程序中最重要的元素之一。Java技术包含了一套丰富的I/O流。这一节我们要讲解文件中字符数据的读写。我们将讲述:生成文件对象。操作文件对象。读写文件流。4.1. 创建一个新的File对象File类提供了若干处理文件和获取它们基本信息的方法。在java技术中,目录也是一个文件。你可以创建一个代表目录的文件,然后用它定义另一个文件:FilemyFile;myFile = new File(mymotd); myFile = new File(/, mymotd);/more useful if the directory or filename is a variable FilemyDir = new File(/);myFile = new File(myDir, mymotd);你所使用的构造函数经常取决于你所使用的其他文件对象。例如,如果你在你的应用程序中只使用一个文件,那么就会使用第一个构造函数。如果你使用一个公共目录中的若干文件,那么使用第二个或者第三个构造函数可能更容易。File类提供了独立于平台的方法来操作由本地文件系统维护的文件。然而它不允许你存取文件的内容。注意:你可以使用一个File对象来代替一个String作为FileInputStream和FileOutputStream对象的构造函数参数。这是一种推荐方法,因为它独立于本地文件系统的约定。4.2. 文件测试和工具当你创建一个File对象后,你可以使用下面任何一种方法来获取有关文件的信息:文件名:l String getName()l String getPath()l String getAbsolutePath()l String getParent()l boolean renameTo(File newName)文件测试:l boolean exists()l boolean canWrite()l boolean canRead()l boolean isFile()l boolean isDirectory()l boolean isAbsolute()通用文件信息和工具:l long lastModified()l long length()l boolean delete()目录工具:l boolean mkdir()l String list()4.3. 文件流I/O下面的程序读一个文本文件,将每一行回显在标准输出上,然后打印文件:importjava.io.*;public classReadFilepublic static voidmain(String args)Filefile = new File(args0);tryBufferedReaderin = new BufferedReader(new FileRead(file) );Strings;s = in.readLine();while(s != null)System.out.println(“Read: “ + s);s = in.readLine();in.close();catch(IOException e2)e2.printStackTrace();4.4. 文件输出下面的程序从键盘读如数据行,写入文件中:importjava.io.*;public classWriteFilepublic static voidmain(String args)Filefile = new File(args0);tryBufferedReaderin = new BufferedReader(new InputStreamReader(System.in) );PrintWriterout = new PrintWriter(new FileWriter(file) );Strings;System.out.print(“Enter file text. “);System.out.println(“Type ctrl-d to stop.”);While( (s = in.readLine() ) != null)out.println(s);in.close();out.close();catch(IOException e)e.printStackTrace();5. 数学类Math类是用来支持数学计算的,它打包在java.lang包中,包含一组静态方法和两个常数,是终态(final)的,它不能被实例化。它主要包括下列方法:切断 double ceil(double d):返回不小于d的最小整数。 double floor(double d):返回不大于d的最大整数。 int round(float f) :返回最接近f的整数(int)。 long round(double d) :返回最接近d的整数(long)。极值、绝对值 double abs(double d):返回d的绝对值。对于float,int,long有类似的函数。 double min(double d1, double 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):将度换算成弧度。对数、指数 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。6. 第六节String类String对象是一个不可变的统一编码字符串。6.1. 创建新String的方法 String concat(String s):返回一个新的String,即,在原来的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中的小写字母变成大写。6.2. 查找方法 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的偏移量。类似有lastindexOf,从串尾开始查找。 int indexOf(int ch, int offset) 返回String中从offset开始查找,第一次出现ch的偏移量。类似有lastindexOf,从串尾开始查找。6.3. 比较方法 boolean equals(String s):如果原String与s逐字符比较都相等,则返回true。 boolean equalsIgnoreCase(String s):如果在忽略大小写的情况下,原String与s逐字符比较都相等,则返回true。 int compareTo(String s):进行词汇比较,如果原String 小于s则返回负数;如果原String 大于s则返回正数;如果原String 等于s则返回零。6.4. 其它方法 char charAt(int index):返回index处的字符。 int length():返回String的长度。7. StringBuffer类StringBuffer对象是一个可以改变的统一编码字符串。String与StringBuffer之间没有继承关系。7.1. 构造函数 StringBuffer():创建一个空的StringBuffer。 StringBuffer(int capacity) :创建一个空的StringBuffer,容量是capacity。 StringBuffer(String initialString) :创建一个StringBuffer,其内容是initialString。7.2. 修改方法 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, double, float, int, long, Object。 StringBuffer reverse():颠倒原StringBuffer中字符的顺序。 void setCharAt(int index, char ch):将StringBuffer中的index处设为ch。 void setlength(int newLength):设定StringBuffer的长度。8. 收集API 收集(或容器)是代表一个对象组的单个对象,被认为是它的元素。收集典型地处理许多对象的类型,所有的类型都有一个特殊的种类(也就是说,它们都是从一个共同父类型延续来的)。Java编程语言支持收集类Vector,Bits, Stack,Hashtable ,LinkedList等等。例如,Stack实现后进先出(LIFO)的顺序,Hashtable提供一个相关的对象数组。 收集保持处理Object类型的对象。这允许在收集中贮存任何对象。它还可以,在使用对象前、从收集中检索到它之后,使用正确的类型转换。 收集API典型地由将对象保持为下述情况的接口而组成: 收集-没有具体顺序的一组对象 设定-没有复制的一组对象 列表-有序对象组,允许复制API还包括诸如HashSet, ArraySet, ArrayList, LinkedList和Vector等等的类,它们实现这些接口。API还提供了支持某些算法的方法,如:排序,二进制搜索,评估列表中的最小和最大,以及收集等。8.1. Collections API的体系结构集合是代表一组对象的单个对象。集合中的对象叫元素。我们在程序设计中经常会用到各种各样的数据结构,如:表、映射、清单、树、集合等。显然,这些数据结构都满足集合的定义。为了方便我们处理各种各样的数据结构,Java在Java.util包中提供了一组API。这组API中的大部分类都实现了Collection接口,因此,被称作Collections API。根据它们处理的不同种类的数据结构,Collections API可分为三类:Collection:一组没有顺序的对象,允许重复相同的元素。Set:一组没有顺序的对象,不允许重复相同的元素。List:一组有顺序的对象,允许重复相同的元素。 Collections API包括诸如HashSet, ArraySet, ArrayList, LinkedList和Vector等等的类。Collections API支持常用算法:排序,二进制搜索,求最小值和最大值等等。Collection接口和类的体系结构有助于我们理解Collections APICollection+add(element : Object) : boolean+remove(element : Object) : boolean+size( ) : int+isEmpty( ) : boolean+contains (element : Object) : boolean+iterator( ) : IteratorSetList+add(index : int, element : Object) +remove(index : int) : Object+get (index : int ) : Object+set (index : int, element : Object)+ indexOf(element : Object) : int+listIterator( ) : ListIteratorHashSetLinkedListArrayList8.2. A Set Example在下面的例题中,程序声明了一个Collections API的Set 型对象,并且用它的子类HashSet初始化它。然后向Set中添加元素,打印结果。注意:11,12行试图向Set添加重复的元素,运行时会返回false。Importjava.util.*;Public classSetExamplePublic static voidmain(String args)Setset = new HashSet();Set.add(“one”);Set.add(“second”);Set.add(“3rd”);Set.add(new Inter(4);Set.add(new Float(5.0F);Set.add(“second”);/falseSet.add(new Inter(4);/falseSystem.out.println(set);执行这段代码会得到下列结果:one, second, 5.0, 3rd, 4注意:HashSet会在每个条目之间加入逗号。8.3. A List Example在下面的例题中,程序声明了一个Collections API的List 型对象,并且用它的子类ArrayList初始化它。然后向List中添加元素,打印结果。注意:由于List允许重复的元素,所以在运行时11,12行会返回true。Importjava.util.*;Public classListExamplePublic static voidmain(String args)Listlist = new ArrayList();list.add(“one”);list.add(“second”);list.add(“3rd”);list.add(new Inter(4);list.add(new Float(5.0F);list.add(“second”);/truelist.add(new Inter(4);/trueSystem.out.println(list);执行这段代码会得到下列结果:one, second, 5.0, 3rd, 48.4. 迭代(Iterators)可以用迭代扫描一个集合。基本的Iterator接口可以向前扫描任何集合。对于一个Set来说,它的迭代是没有顺序的。对于一个List来说,它的迭代的顺序与List中元素的顺序相同,只能向前,不能后退。此外,List对象还支持ListIterator接口,允许迭代向后移动。示例:Listlist = new ArrayList();/add some elementsIterator elements = list.iterator();While(elements.hasNext()System.out.println(elements.next();8.5. 映射(Maps)映射这种数据结构含有两个部分:关键字和值。对于每个关键字都有一个值,也就是说,一个关键字映射一个值。映射允许通过关键字访问数据结构。Java 在Collections API的Map接口中声明了一对一的映射。当向映射中插入一对关键字和值时,如果出现关键字重用,则用新值替换映射中原有的值,不在映射中增加一个元素。下面的代码读取一个文本文件,输出每个单词在文件中出现的次数,这段代码解释了映射的用法:importjava.util.Map;importjava.util.HashMap;importjava.util.Iterator;importjava.util.FileReader;public classMapExamplepublic static voidmain(String args)throws java.io.FileNotFoundExceptionMapword_count_map = new HashMap();FileReaderreader = new FileReader(args0);Iteratorwords = new WordStreamIterator(reader);While(words.hasNext()Stringword = (String) words.next();Stringword_lowercase = words.toLowerCase ();/this is the keyIntegerfrequency = (Integer) word_count_map.get(word_lowercase);If(frequency = null)frequency = new Integer(1); Elseintvalue = Value;frequency = new Integer(value + 1);word_count_map.put(word_lowercase, frequency);System.out.println(word_count_map);执行:java MapExample MapExample.java结果:import=4, java=4, util=4, Map=1, HashMap=1, Iterator=1, FileReader=1,public=2,.8.6. 排序(sorting)对于复杂的应用,尤其是生成报表时,排序是一种必不可少的基本操作。在Java 2 Collections API中,已经实现了几种排序。给数组排序可以使用Arrays对象的一套sort方法。对于boolean以外的基本类型,Arrays.sort有两种变化:Arrays.sort( array)用来为整个数组排序。Arrays.sort( array, int fromIndex, int toIndex)用来为数组的一部分排序。对于引用类型,Arrays.sort有四种种变化:Arrays.sort(Object array)用默认的比较器为整个数组排序。Arrays.sort(Object array, int fromIndex, int toIndex)用默认的比较器为数组的一部分排序。Arrays.sort(Object array, Comparator comparator)为整个数组排序。Arrays.sort(Object array, int fromIndex, int toIndex, Comparator comparator)为数组的一部分排序。由于排序算法必须比较两个对象,所以使用Arrays.sort方法时要传递比较器参数。比较器有两种类型:一种是实现Comparable接口的, 另一种是实现Comparator接口的。Comparable接口定义了一个方法:int compareTo(element, Object)。这个方法比较 Object 与element。如果Object小于element,则返回负值;如果Object大于element,则返回正值;如果Object等于element,则返回零。Comparator接口定义了两个方法:compare(e1 : Object , e2 : Object ) :int。如果e1小于e2,则返回负值;如果e1大于e2,则返回正值;如果e1等于e2,则返回零。equals(object : Object) : boolean。用于判断两个比较器对象是否相等。该方法在继承Object类时已经被实现。下面的程序阐明了如何为double型数组排序:importjava.util.Arrays;importjava.text.DecimalFormat;publicclassSortingExample1public static voidmain(String args)double random_values = new double 10;for(int i=0; i random_values.length; i+)random_valuesi = Math.random( );System.out.println(“Unsorted Array:”);PrintArray(random_values);Arrays.sort(random_values);System.out.println(“sorted Array:”);PrintArray(random_values);private static voidPrintArray(double array)System.out.print();For(int i=0; iarray.length; i+)System.out.print(FORMAT.format(arrayi);If( (i+1) array.length )System.out.print(, );System.out.print();private static DecimalFormatFORMAT = new DecimalFormat(“0.000”);执行这段程序,输出下列结果:Unsorted Array:0.604, 0.717, 0.835, 0.050, 0.662, 0.168, 0.919, 0.958, 0.637, 0.011sorted Array:0.011, 0.050, 0.168, 0.604, 0.637, 0.662, 0.717, 0.835, 0.919, 0.958下面的程序阐明了如何为清单排序,清单中保存“单词/出现次数”的映射条目:importjava.util.*;public classSortingExample2public static voidmain(String args) throws java.io.FileNotFoundException Mapword_count_map = new WordCountMap(args0);Setentry_set = word_count_map.entrySet();System.out.println(“Unsorted Entry Set:n” + entry_set);/生成“单词/出现次数”条目列表,按字母顺序排序。Listentry_list = new ArrayList(entry_set);Collections.sort(entry_list, new AlphaComparator() );System.out.println(“nEntry Set (sorted by alpha) :n” + entry_list);/Sort the list by frequencyCollections.sort(entry_list, new FreqComparator() );System.out.println(“nEntry Set (sorted by freq) :n” + entry_list);private static classAlphaComparatorimplements Comparator public intcompare(Object e1, Object e2)Stringword1 = (String) ( (Map.Entry) e1).getKey();Stringword2 = (String) ( (Map.Entry) e2).getKey();RpareTo(word2);private static classFreqComparator( )implements Comparator public intcompare(Object e1, Object e2)StringFreq1 = (String) ( (Map.Entry) e1).detValue();StringFreq2 = (String) ( (Map.Entry) e2).detValue();ReturnFpareTo(Freq1);9. 使用javadoc工具无论你的代码属于独立的应用,还是属于APIs,代码的文档都是非常重要的。这一节粗略介绍javadoc和注释标签。下面的命令行生成一个项目的HTML文档:javadoc private d ./doc/api

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论