2.2 输入输出
程序运行时,可能需要给程序输入数据,这时需要用到输入语句;程序处理完数据,要将结果输出出来,这时就要用到输出语句。
Java采用流式方式对数据进行输入输出。Java定义了很多流类,可以通过流类的对象及其中的方法实现数据的输入输出(关于类、对象的概念读者可以先不必深入理解,只要按照下面介绍的方法使用就可以了)。
2.2.1 输入
输 入
从键盘(标准输入设备)输入数据,可以用Scanner类的对象及其中的方法(C/C++语言称为函数)实现输入。
Scanner类的对象的定义形式:
Scanner reader=new Scanner(System.in);
reader是Scanner类的一个对象。
Scanner类中有较多的方法,常用的与基本数据类型有关的方法见表2-5。
表2-5 Scanner类中的常用方法
续表
【例2.2】基本数据类型数据的输入与输出。
【代码】
import java.util.Scanner;//必须写上这条语句
public class Example2_02
{
public static void main(String args[])
{
boolean bool;
byte b;
short s;
int i;
long lg;
float f;
double d;
String str;
Scanner reader=new Scanner(System.in);
bool=reader.next Boolean();
b=reader.next Byte();
s=reader.next Short();
i=reader.next Int();
lg=reader.next Long();
f=reader.next Float();
d=reader.next Double();
str=reader.next Line();
System.out.println("输出:");
System.out.println("\tbool="+bool);
System.out.println("\tb="+b);
System.out.println("\ts="+s);
System.out.println("\ti="+i);
System.out.println("\tlg="+lg);
System.out.println("\tf="+f);
System.out.println("\td="+d);
System.out.println("\tstr="+str);
}
}
程序运行结果如图2-3所示。
图2-3 例2.2的运行结果
例2.2程序运行时,所有数据可以在一行输入,也可以分多行输入。
【例2.3】已知若干名学生某一课程的成绩,计算这些学生的总成绩和平均成绩。
由于学生人数未知(如多个班级),所以无法准确输入成绩数。这时可以利用方法has Next XXX()判断是否还有成绩。如果有,则继续累加;否则计算平均成绩。
输入时,所有学生的成绩输入完成后,再输入任意一个字符或字符串(非数值型数),则程序不再等待输入。
【代码】
import java.util.Scanner;
public class Example2_03
{
public static void main(String args[])
{
double score,total=0;
int counter=0;
Scanner input=new Scanner(System.in);
System.out.println("输入若干学生成绩,以任一字符(串)结束:");
while(input.has Next Double())
{
score=input.next Double();
total+=score;
counter++;
}
System.out.printf("总成绩:%.1f,",total);
System.out.printf("平均成绩:%.1f\n",total/counter);
}
}
程序运行结果如图2-4所示。
图2-4 例2.3的运行结果
2.2.2 输出
输出
基本数据类型可以用Print Stream类中的方法完成输出。类中有3种常用的方法:
void print(基本数据类型数据);
void println([基本数据类型数据]);
void printf(输出格式控制字符串,输出项表列);
1.print()方法
print()方法有并且只能有一个基本数据类型的数据,包括字符串类型,它输出数据后不换行。
如输出“a=10”。“a=10”相当于两个数据,“a=”是一个数据,“10”是一个数据。如果想调用一次print()函数将“a=10”输出,可以将两个数变成一个数:
“a=”+a
其中的“+”运算可将a的值转换成对应的字符串“10”并连接到“a=”后面形成一个字符串“a=10”,这个字符串再当作print()的参数就可以输出想要的结果,如例2.2。
2.println()方法
println()方法可以有参数也可以没有参数。
如果没有参数,只输出一个换行。如果有参数,有并且只能有一个基本数据类型的参数,输出该参数后换行。它的参数用法与print()方法相同。
print()方法与println()方法有两个区别,一个是是否换行,另一个是是否可以不带参数。
println()方法的使用参见例2.2。
3.printf()方法
printf()方法是有格式的数据输出方法,它一次可以按给定的格式输出较多的数据。使用起来较方便。它的使用形式:
printf(String format, Object… args)
“format”是用于控制后面输出项的字符串,“args”是个数可变的输出数据。
“format”的格式如下:
[普通字符]%[标志字符][输出宽度][.小数位数]格式控制字符[普通字符]
其中的“%”和“格式控制字符”必须有,其余的可有可无。“普通字符”按原样输出。“格式控制字符”如表2-6所列。
表2-6 格式控制字符
*如0x1.9p6,1.9是十六进制数,p6是26,0x1.9p6=(1+9/16)*26=100.0
“标志字符”如表2-7所列。
表2-7 标志字符
“输出宽度”是一个整型数,指的是一个数据输出时占的位数。如果数据的实际宽度比指定宽度大,则按数据的实际宽度输出。如果指定的宽度比实际宽度大,则用空格填充不足部分,或者指定了标志字符“0”,则用“0”填充。
“小数位数”指的是输出浮点数时小数的个数,不指定(默认)则输出6位。
“格式控制字符”必须与后面的输出项相对应。
Java中有一个系统类System,类中有一个域——Print Stream类的对象,这个对象是一个标准输出对象。利用这个对象调用上面的3个方法就可以将数据输出到屏幕上。
【例2.4】printf()方法的使用。
【代码】
public class Example2_04
{
public static void main(String args[])
{
int a=123,b=456;
System.out.printf("1:a>b=%b,a<b=%B%n",a>b,a<b);//注意换行
System.out.printf("2:%-8d,%8d",a,b);//无换行
System.out.print('\n');//换行
System.out.printf("3:%d,%o,%x\n", -1,-1,-1);
System.out.printf("4:%(d,%#o,%#x\n",-1,-1,-1);
System.out.printf("5:%2d,%8d,%08d\n", a,b,b);
double d=1234.45678901;
System.out.printf("6:%f,%.2f,%8.5f\n",d,d,d);
System.out.printf("7:%E,%8.2e,%15.6E\n",d,d,d);
System.out.printf("8:%a\n",99.0);
String str="Beijing";
System.out.printf("9:addr——%s\n",str);//注意大小写
System.out.printf("10:addr——%20S\n",str);
long l=123456778899L;
System.out.printf("11:%,+d\n",l);
}
}
程序运行结果如图2-5所示。
图2-5 例2.4运行结果