2.8 输入/输出初步

为了使读者尽早进行Java程序的上机实践,这里先介绍一些Java语言中有关输入和输出的基本内容。

2.8.1 标准输入/输出

1.标准输出

(1)print和println方法

从前面的例子程序中,可以看到程序中的System.out.println方法可以将常量、变量或表达式的值输出到屏幕。println方法可有0 个或1 个参数。若参数是0 个,则输出一回车换行,光标移动到下一行行首;若有一个参数,该参数可以是char、byte、int、boolean、float、double、String、char[](字符数组)和Object(对象)类型的,各种类型的数据转换成相应的字符串类型输出。println方法在输出给定内容后,输出一个回车换行。另外也常用System.out.print进行输出,print方法需要一个参数来输出,可用的参数类型与println相同,输出参数的值后不输出回车换行,因此,若输出内容本身不包含控制光标的内容或未满行,System.out.print输出后,光标将停留在输出内容后。

在实际输出时,经常需要将提示信息与变量值一起输出,但print和println方法只支持一个输出项,这时,可参考前面各例中的方法,用“+”运算符连接多个输出项为一项进行输出。例如:

              设有int i = 10,j = 20;
                  System.out.println("i= " + i + " j= " + j);// 输出为i= 10 j= 20
                  System.out.println(i + j);                     // 输出为30
                  System.out.println("sum= " + i + j);         // 输出为sum= 1020
                  System.out.println("sum= " + (i + j));      // 输出为sum= 30

(2)printf和format格式输出方法

要控制输出数据的格式,可使用System.out.printf和类似的System.out.format方法,在方法的参数中对每一输出项(表达式),都可在一个格式控制字符串中用%开始的格式符进行格式控制。例如:

              System.out.printf("a=%d\tb=%f\tc=%c",a,b,c);
              或:System.out.format("a=%d\tb=%f\tc=%c",a,b,c);

其中的输出项为a、b和c三项,在格式控制字符串"a=%d\tb=%f\tc=%c"中有三个格式符对它们进行控制,未指出顺序时,按照自然顺序进行格式控制,即:%d控制a使其以十进制整数形式输出;%f控制b使其以十进制实数形式输出;%c控制c使其以字符形式输出。为了能得到正确输出的数据和格式,不同类型的输出项应使用不同的格式符来进行格式控制输出。常用格式符有:

              %b布尔型数据
              %c字符
              %s字符串
              %d十进制整数
              %x十六进制整数
              %f十进制实数(默认为六位小数)
              %e或%g科学记数法形式的十进制实数
              %n  输出换行符
              %tX用单个字符X表示需要截取日期的年、月、日、星期等组成部分

在格式字符中还可以加显示域宽、指定小数的位数和对其方式等,格式控制字符串中的其他字符,无格式控制功能,输出时将按字符原样输出。如上例中的"a="、"b="、"c="和"\t"(制表符)将按格式控制字符串中出现的位置用原意输出。需注意的是,Java的格式字符与C语言的格式字符不是100%兼容的。例如,下面的语句:

              Calendar c = Calendar.getInstance();
              System.out.printf("%tD,%tT,%tb%n%tc%n",c,c,c,c);

将输出:

              05/03/10,16:00:08,五月
              星期一 五月 03 16:00:08 CST 2010

更多的格式符和控制功能可参见APⅠ资料中关于java.util.Formatter类说明。

2.标准输入

(1)read方法

在Java中,System.in.read()方法可用于从键盘输入整数值在0~255之间的byte值(int类型)。

应用本方法时要使用Java异常处理机制,如下列程序中的throws ⅠOException。关于异常处理的知识,可见第3章和以后各章的相应章节的介绍。

【例2.9】从键盘输入一个字符,并输出它在Unicode字符集中的前一字符和后一字符。

              import java.io.*;  // 引入java.io包
              class CharDemo {
                public static void main(String args[]) throws IOException{ // 抛弃异常
                  char c,c1,c2;
                  System.out.println("请输入一个字符,并按回车键!");
                  c=(char)System.in.read(); // 输入字符
                  c1=(char)(c-1);
                  c2=(char)(c+1);
                  System.out.println(":" + c1);
                  System.out.println(":" + c2);
                }
              }

(2)使用支持各种类型数据输入的next方法

若使用Java提供java.util.Scanner类中的各种next方法,可从键盘输入各种基本类型和字符串类型的数据。不论需从键盘输入何种类型的数据,Java从键盘接收数据都是以字符串的形式进行的,next方法要根据输入数据的类型来选用。有nextByte、nextⅠnt、nextShort、nextLong、nextFloat、nextDouble、nextBoolean和next(以空格和回车为结束标记的字符串输入)等适用于不同类型数据输入的方法。使用next方法进行键盘输入的例子如下。

【例2.10】从键盘输入三角形的三个边长,求这个三角形的面积。

              import java.util.Scanner;
              class TriArea{
                public static void main(String args[]){
                  System.out.printf("请输入三角形的三边长: \n");
                  Scanner sc = new Scanner(System.in);
                  double a = sc.nextDouble();
                  double b = sc.nextDouble();
                  double c = sc.nextDouble();
                  double t = (a+b+c)/2.0;
                  double s = Math.sqrt(t*(t-a)*(t-b)*(t-c));
                  System.out.format("三角形的面积为%f\n",s);
                }
              }

程序的一次运行如下:

              请输入三角形的三边长:11 12 13(输入三角形的三个边长值后,按Enter键)
              三角形的面积为61.481705

2.8.2 对话框输入/输出

使用对话框功能可以在程序中进行数据的输入和输出,使用对话框功能需引入相应的类:import javax.swing.JOptionPane;。

1.使用showMessageDialog(输出信息对话框)方法输出信息

Java中的JOptionPane.showMessageDialog方法是用对话框的形式来进行输出的,支持一个输出项,在输出内容较多时,也可用字符串连接的形式来输出。例如下面的程序:

【例2.11】求sin30°和cos30°的值。

              import javax.swing.JOptionPane;
              import static java.lang.Math.*;
              class DialogDemo{
                public static void main(String args[]){
                  String s1="sin30度的值=";
                  s1 = s1 + sin(PI*30/180);
                  s1 = s1 + "\ncos30度的值=";
                  s1 = s1 + cos(PI*30/180);
                  JOptionPane.showMessageDialog(null,s1);
                }
              }

它的输出结果见图2.1。

图2.1 例2.11的运行结果

2.使用showInputDialog方法输入信息

使用Java提供的javax.swing.JOptionPane类中的showⅠnputDialog方法,可从输入信息对话框中输入一个字符串。需要时,可进行类型转换,得到所需类型的输入数据。

【例2.12】使用对话框进行程序的输入/输出。输入一个代表年号的整数,求这一年的元旦是星期几?

元旦是星期几的计算公式(设年号为y,按整数运算):

                        s = y + (y-1) / 4- (y-1) / 100 + (y-1)/ 400;

s除以7的余数即为星期数,余数为0表示星期日。

              import javax.swing.JOptionPane;
              class YuanDan{
                public static void main(String args[]){
                  int s,y;
                  y=Integer.parseInt(JOptionPane.showInputDialog("请输入一个年号:"));
                  s = y + (y-1) / 4- (y-1) / 100 + (y-1)/ 400;
                  s = s % 7;
                  JOptionPane.showMessageDialog(null,y + " 年的元旦是星期 "+ s);
                }
              }

程序运行的界面及结果见图2.2和图2.3。

图2.2 例2.12的输入

图2.3 例2.12的输出