六、System类 1.系统属性 (1)系统属性(System Properties)是Java提供的另外一种运行时给程序提供参数的方法。属性(Property)是名字和值之间的映射,这里名字和值都只能是String。 (2) Java有一个类Properties描述了名字和值之间的映射。 System.getProperties方法返回系统的Properties对象。 System.getProperty(String propertyName)方法返回对应名字属性的值。 System.getProperty(String name,String value)重载方法当没有name指定的属性时,返回value指定的缺省值。 (3)每一个JVM提供了一组缺省属性,可以通过System.getProperties方法的帮助文档了解到。基本类型的包装类中包含静态方法,用于将属性值转换成对应类型的值。如Boolean.getBoolean(String); Long.getLong(String)。String参数这里是属性名字,如果属性不存在,那么返回false或null。 (4) Properties类的对象包含两个主要方法: getProperty(String Name)和getProperty(String Name, String value)方法返回对应名字属性的值。 properNames()列举系统的一组对象名字,进而可以列举系统的属性值。 例如: import java.util.Properties; import java.util.Enumeration; public class TestProperties{ public static void main(String args[]){ Properties props = System.getProperties(); Enumeration prop_names = props.propertyNames();//这是个早期的集合类 while(prop_names.hasMoreElements()){ String prop_name = (String) prop_names.nextElement(); String property = props.getProperty(prop_name); System.out.println("Property '" + prop_name + "' is '" +property+"'"); } } } prop_names是Enumeration是枚举类型的对象,包含一组属性名,允许程序循环列出。 hasMoreElements方法检测是否还有其它元素, nextElement返回程序的下一个元素。 运行:java -DMyProp=theValue TestProperties 注意:严格的格式 –D后没有空格 运行结果:很多的Java系统级属性,下面列出部分,太多了,你可以把程序运行一下: Property 'java.runtime.name' is 'Java(TM) SE Runtime Environment' Property 'sun.boot.library.path' is 'c:\jdk1.6.0_01\jre\bin' Property 'java.vm.version' is '1.6.0_01-b06' Property 'java.vm.vendor' is 'Sun Microsystems Inc.' Property 'java.vendor.url' is 'http://java.sun.com/' 。。。。。。 2.控制台输入输出 许多应用程序要与用户进行文本I/O(输入/输出)交互,标准输入是键盘;标准输出是终端窗口。Java SDK支持控制台I/O使用三个java.lang.System类中定义的变量: System.out是一个PrintStream对象,初始引用启动Java的终端窗口。 Syste.in是一个InputStream对象,初始指向用户键盘。 System.err是一个PrintStream对象,初始引用启动Java的终端窗口。 这三个对象都可以重新定向(如文件):System.setOut\setIn\setErr。 往标准输出写东西使用PrintStream对象的println或print方法。print方法输出参数;但println方法输出参数并追加一个换行符。 println或print方法都对原始类型进行重载,同时还重载了char[]和Object,String。参数是Object时,调用参数的toString方法。 输出例子 : publicclass Test { publicstaticvoid main(String args[]) { char c[] = { 'a', 'b', 'c' }; System.out.println(c); } } 运行结果:abc 输入例子: import java.io.*; publicclass Test { publicstaticvoid main(String args[]) { String s = ""; InputStreamReader ir = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(ir); System.out.println("Ctrl+z to exit"); try { s = in.readLine(); while (s != null) { System.out.println("Read:" + s); s = in.readLine(); } in.close(); } catch (IOException e) { e.printStackTrace(); } } } 运行的时候从控制台输入数据,然后回车,就看到具体读入的值的输出了。 这里先看看,涉及到后面要学习的I/O的知识。 3.格式化输出printf 从JDK5.0开始,Java里面提供了C风格的格式化输出方法 —— printf, 比如输出一个加法算式,JDK5.0版本以前的写法是: publicclass Test { publicstaticvoid main(String[] args) { int x = 5; int y = 7; int nSum = x + y; System.out.println(x + " + " + y + " = " + nSum); } } 运行结果:5 + 7 = 12 而在JDK5.0以后版本中可以写为: publicstaticvoid main(String[] args) { int x = 5; int y = 7; int nSum = x + y; System.out.printf("%d + %d = %d\n", x, y, nSum); } } 以上两种写法的输出结构是一样的,即“5 + 7 = 12”。 这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式输出,可以写为: publicclass Test { publicstaticvoid main(String[] args) { int x = 5; int y = 7; int nSum = x + y; System.out.printf("d + d = d\n", x, y, nSum); } } 运行输出结果将是“05 + 07 = 12”。 其实这个功能在Java里面并没有什么大用,具体的printf格式化字符串格式请参见JDK文档中的具体说明。 4.属性文件 后缀为“.properties”的文件在Java中被称为属性文件,是Java中历史悠久,使用频繁的配置文件(或者叫资源文件)格式。 属性文件的基本格式为:key=value Java提供现成的API来读取properties文件的内容,并进行解析,所以使用非常方便。运行时候只要把“.properties”文件放到classpath下就可以了。 示例如下:假设有一个test.properties如下: #表示注释 test1=This is Java properties #默认的properties是不认中文的,需要编码(后面会学到),所以这里用英文测试 test2=Welcome to Java World Java读取 Java有好几种方法来读取properties文件,这里演示其中一种: import java.io.*; publicclass Test { publicstaticvoid main(String args[]) { try { String name = "test.properties"; InputStream in = new BufferedInputStream(new FileInputStream(name)); Properties p = new Properties(); p.load(in); System.out.println("test1的值=="+p.getProperty("test1")); System.out.println("test2的值=="+p.getProperty("test2")); } catch (Exception err) { err.printStackTrace(); } } } 运行结果: test1的值==This is Java properties test2的值==Welcome to Java World 作业 1.在MyPoint 类中增加equals方法(覆盖Object的equals方法),以比较两个MyPoint对象的内容是否相等。 2.编写一个截取字符串的方法,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。 3:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。请编写一个方法来实现上述加密算法。 5.定义一个长度为10的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”,不包含就打印出“No”。 8:统计字符串中英文字母、空格、数字和其它字符的个数。 4.一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 (不使用数学公式,要求用递归) 5.输出一个字符数组中的所有字符的所有组合。比如有字符集str={A,B,C}。应输出: A B C AB AC BA BC CA CB ABC ACB BAC BCA CAB CBA 6.已知两个对像String s1,String s2,已用ASC码排序好了,编写程序将两个String 合并,得到的结果。例如:s1="abc" s2="abc" 得s="aabbcc";结果也是排序的 7.两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 8.企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,请编写程序,输入当月利润,求应发放奖金总数? 9.老伯伯要带鱼、狗、猫过河到对岸.,有一条船,只能坐一个人,老伯每次只能带一样动物过河,当老伯不在的时侯狗会咬猫,猫会吃鱼.,请问怎么顺序过河呢?要求:编写程序,由程序来推出过河的顺序 Java私塾跟我学系列——JAVA篇 网址:http://www.javass.cn 电话:010-68434236 |