在结束关于IO的讨论之前,我们将介绍在读数值字符串时一项很有用的技术.如你所知,Java的println()方法提供了一种向控制台输出各种类型数据的方法,包括内置类型的数值,如int和double.因此,println()自动将数值转换为可读形式.但是,read()这样的方法没有提供类似的可以读取,并将包含数值的字符串转换为内部二进制格式的功能.例如,没有一种read()方法可以读取”100″这样的字符串,然后将其自动转换为对应的能够存储在int变量中的二进制值.Java提供了其他多种方法来完成这一任务,其中最简单的方法可能是使用Java类型封装器(wrapper).
Java的类型封装器的封装或包装了基本类型的类.因为基本类型不是对象,所以需要类型封装器.这在某种程度上限制了他们的使用.例如,基本类型不能通过引用来传递,为满足这种需要,Java为每个基本类型都提供了相应的类.
类型封装器有double,float,long,integer,short,byte,character和boolean.这些类提供了大量的方法来把基本类型整合到Java的对象层次结构中.另一方面的作用是,数值封装器还定义了可以把数值字符串转换为对应二进制值的方法.下表显示了一些转换方法,每个方法都返回字符串对应的二进制值:
封装器
|
转换方法
|
double
|
static double parseDouble(String str) throws NumberFormatException
|
float
|
static float parseFloat(String str) throws NumberFormatException
|
long
|
static long parseLong(String str) throws NumberFormatException
|
integer
|
static int parseInt(string str) throws NumberFormatException
|
short
|
static short parseShort(string str) throws NumberFormatException
|
byte
|
static byte parseByte(String str) throws NumberFormatException
|
整数封装器还提供了一种可以指定基数的分析方法.
这种分析方法为我们把从键盘或文本文件做为字符串读取的数值转换为对应的内部格式提供了简便的途径.例如,下面的程序演示了parseInt()和parseDouble().程序计算用户输入数据的平均数.首先,程序让用户输入要计算平均数的值的数量,然后使用readLine()来读取数值,并使用parseInt()把字符串转换为整数.接着,送parseDouble()把字符串转换为对应的都变了类型,并输入这些值.
public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader( new InputStreamReader(System.in) ); String str; int n; double sum = 0.0; double avg,t; System.out.println("How many numbers will you enter:"); str = br.readLine(); try { n = Integer.parseInt(str); }catch (NumberFormatException exc) { System.out.println("Invalid format"); n=0; } System.out.println("Enter "+n+" values"); for(int i=0;i<n;i++) { System.out.print(":"); str = br.readLine(); try { t = Double.parseDouble(str); } catch (NumberFormatException exc) { System.out.println("Invalid format"); t = 0.0; } sum += t; } avg = sum/n; System.out.println("average is "+avg); }
运行结果如下所示:
How many numbers will you enter: 3 Enter 3 values :12312.2 :312321 :1.2 average is 108211.46666666667
问:基本类型封装器还可以做什么?
答:基本类型封装器提供了一些方法来帮助将基本类型整合到对象层次结构中.例如,Java库提供的包括映射,列表和集合在内的各种存储机制只能应用与对象.因此,例如要存储int数据,就必须把他封装到一个对象中.而且,所有类型封装器都有一个名为compareTo()的方法,他可以比较封含在封装器中的值;还有一个用于测试两个值是否相等的方法equals();以及以不同形式返回对象值的一些方法.