9.与运行环境交互

本章要点

  • java程序的参数
  • 程序运行过程中接受用户输入
  • System类相关用法
  • Runtime类的相关用法
  • 使用String,StringBuffer,StringBuilder类
  • 使用Math类进行数学计算
  • 使用BigDecimal保存精确浮点数
  • 使用Random类生成各种伪随机数
  • Date,Calendar的用法及之间的联系
  • 创建正则表达式
  • 通过Pattern和Matcher使用正则表达式
  • 通过String类使用正则表达式

9.1 用户互动

如果一个程序总是按既定的流程运行,无须处理用户动作,这个程序总是比较简单的。实际上,绝大部分程序都需要处理用户动作,包括接受用户的键盘输入,鼠标动作等。

9.1.1 运行java程序的参数

讲解main方法为什么采用这个方法签名:

  • public修饰符:java类由JVM调用,为了让JVM可以自由调用这个main方法,所以使用public修饰符把这个方法暴露出来。
  • static修饰符:JVM调用这个主方法时,不可能先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过主类来调用主方法,因此使用static修饰该主方法。
  • void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main方法没有返回值。

9.1.2 使用Scanner获取键盘输入

9.1.3 使用BufferedReader获取键盘输入

9.2 系统相关

java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。java提供了System类和Runtime类来与程序运行的平台交互。

9.2.1 System类

System类代表当前java程序的运行平台,程序不能创建System类的对象,所以它提供了一些类属性和类方法,允许直接通过System类名来调用这些属性和方法。

System类提供了代表标准输入,标准输出和错误输出的类属性;并提供了一些静态方法用于访问环境变量,系统属性的方法;还提供了价值文件和动态链接库的方法。

9.2.2 Runtime类

Runtime类代表java程序的运行时环境,每个java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。

应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。

与System类似的是:Runtime类也提供了gc()方法和runFinallization()方法来通知系统进行垃圾回收,清理系统资源,并提供了load(String filename)和loadLibrary(String libname)方法来加载文件和动态链接库。

Runtime类代表java程序的运行时环境,可以访问JVM的相关信息,如处理器数量,内存信息等。

9.3 常用类

9.3.1 Object 类

Object类是所有类,数组,枚举类的父类,也就是说,java允许把所有任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类。

因为所有java类都是Object类的子类,所以任何java对象都可以调用Object类的方法,Object提供了如下几个常用方法:

  • boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是:两个对象是同一个对象,因此该equals方法通常没有太大的实用价值。
  • protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
  • Class<?> getClass():该方法返回该对象的运行时类。
  • int hashCode():返回该对象的hashCode值。默认情况下,Object类hashCode()方法根据该对象的地址来计算(即与System.identityHashCode(Object x)方法的计算结果相同)。但很多类都重写Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值。
  • String toString():返回该对象的字符串表示,当我们使用System.out.println方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString方法返回该对象的字符串表示。Object的toString方法返回“运行时类名@十六进制hashCode值”格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

除此之外,Object还提供了wait,notify,notifyAll几个方法,通过这几个方法用于控制线程的暂停和运行。

9.3.2 String,StringBuffer和StringBUilder类

字符串就是一连串的字符序列,java提供了String和StringBuffer两个类来封装字符串,并提供了系列方法来操作字符串对象。

String类是不可变类的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append,insert,reverse,setCharAt,setLength等方法可以改变这个字符串对象的字符序列。一旦通过Stringbuffer生成了最中心想要的字符串,就可以调用它的toString方法将其转换为一个String对象。

JDK1.5 又新增来了一个StringBuilder类,它也代表了字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,应该优先考虑使用Stringbuilder类。

String类提供了大量构造器来创建String对象。

9.3.3 Math 类

9.3.4 Random 类

Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子,另一个构造器需要程序员显式传入一个long型整数的种子。

相对于Math的random()方法而言,Random类提供了更多方法来生成各种伪随机数,它不仅可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。

9.3.5 BigDecimal 类

为了能精确表示,计算浮点数,java提供了BigDecimal类。

9.4 处理日期的类

java还提供了一系列用于处理日期,时间的类,包括创建日期,时间对象,获取系统当前日期,时间等操作。

9.4.1 Date类

java提供了Date类来处理日期,时间。

9.4.2 Calendar类

因为Date类的设计上存在一些缺陷,所以java提供了Calendar类来更好地处理日期和时间。Calendar是一个抽象类,它用于表示日历。

Calendar本身是一个抽象类,它是所有日历类的模板,并提供了一些所有日历通用的方法,但它本身不能直接实例化。程序只能创建Calendar子类的实例,java本身提供了一个GregorianCalendar类,一个代表GregorianCalendar的子类,它代表了我们通常所说的公历。

Calendar类是一个抽象类。

9.4.3 TimeZone 类

9.5 正则表达式

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找,提取,分割,替换等操作。String类里也提供了如下几个特殊的方法:

  • boolean matches(String regex):判断该字符串是否匹配指定正则表达式。
  • String replaceAll(String regex,String replacement):返回该字符串中所有匹配正则表达式的子串替换成replacement后的新字符串。
  • String replaceFirst(String regex,String replacement):返回该字符串中第一个匹配正则表达式的子串替换成replacement后的新字符串。
  • String[] split(String regex):根据给正则表达式拆分该字符串后得到的字符串数组。

上面这些特殊方法都依赖于java提供的正则表达式支持,除此之外,java提供了Pattern和Matcher两个类专门用于提供正则表达式支持。

正则表达式是一种非常简单,而且非常实用的工具。正则表达式是一个用于匹配字符串的模板。可以说,我们定义的任意字符串都可以当成正则表达式实用。

9.5.1 创建正则表达式

9.6 程序国际化

全球化的Internet需要全球化的软件。全球化软件,意味着同一种版本的产品能够容易地适用于不同地区的市场。就开发者所关心的,软件的全球化意味着国际化和本地化。当一个应用需要在全球范围使用的时候,就必须考虑在不同的地域和语言环境下的使用情况,最简单的要求就是用户界面上的信息可以用本地化语言来显示。

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区,语言的不同而显示不同的界面。例如,如果请求来自于中文操作系统的客户端,则应用程序中的各种提示信息错误和帮助都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并作出英文的响应。

引入国际化的目的是为了提供自适应,更友好的用户界面,并不需要改变程序的逻辑功能。国际化的英文单词是Internationlization,但因为这个单词太长了,有时也简称I18N,其中I是这个单词的第一个字母,18表示中间省略的字母个数,而N代表这个单词的最后一个字母。

一个国际化支持很好的应用,会随着在不同区域使用时,呈现出本地语言的提示。这个过程也被称为Localization,即本地化。类似于国际化可以称为I18N,本地化也可以称为L10N。

java语言内核基于UNICODE2.1编码集,提供了对不同国家,不同语言的支持,它已经具有国际化和本地化的特征和API,因此,java程序的国际化相对比较简单。尽管java开发工具为国际化和本地化的工作提供了一些基本的类,但还是有一些对于java应用程序的本地化和国际化来说较困难的工作,例如:消息获取,编码转换,显示布局和数字,日期,货币的格式等。

当然,一个优秀的全球化软件产品,对国际化和本地化的要求远远不止于此,甚至还包括用户提交数据的国际化和本地化。

9.6.1 java国际化的思路

java程序的国际化的思路是将程序中的标签,提示等信息放在资源文件中,程序需要支持哪些国家,语言环境,就对应提供相应的资源文件。

9.6.2 java支持的语言和国家

9.6.3 完成程序国际化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值