Java核心技术第3章(4)

时间:2021-01-06 22:10:43

3.7 输入输出

    打印输出到"标准输出流"(即控制台窗口),只需调用System.out.println即可.然而,读取"标准输入流"System.in就没有那么简单了. 要想通过控制台进行输入, 首先需要构造一个Scanner对象,并与"标准输入流"System.in关联.
Scanner in = new Scanner(System.in);
    现在,就可以 使用Scanner类的各种方法实现输入操作了.例如,nextLine方法将输入一行.
System.out.print("what is your name?");
String name = in.nextLine();
    在这里,使用nextLine方法是因为在输入行中有可能包含空格.要想读取一个单词(以空白符为分隔符),就调用
String firstName = in.next();
    要想读取一个整数,就调用nextInt方法
System.out.print("how old are you?");
int age = in.nextInt();
    与此类似,要想读取下一个浮点数,就调用nextDouble方法.
    最后,在程序的最开始添加上一行:
import java.util.*;
    Scanner类定义在java.util包中.当使用的类不是定义在基本java.lang包中时,一定要使用import指示字符将相应的包加载进来.
    InputTest.java如下所示:
import java.util.*;

/**
* This program demonstrates console input
*/
public class InputTest
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);

// get first input
System.out.print("what is your name?");
String name = in.nextLine();

// get second input
System.out.print("how old are you?");
int age = in.nextInt();

// display output on console
System.out.println("hello, " + name + ", Next year,you'll be " + (age + 1));
}
}
    java.util.Scanner的方法有如下:
Scanner(InputStream in);
    用给定的输入流创建一个Scanner对象
String nextLine()
    读取输入的下一行内容
String next()
    读取输入的下一个单词(以空格作为分隔符)
int nextInt()
double nextDouble()
    读取并转换下一个表示整数或浮点数的字符序列
boolean hasNext()
    检测输入中是否还有其他单词
boolean hasNextInt()
boolean hasNextDouble()
    检测是否还有表示整数或浮点数的下一个字符序列

3.7.2   格式化输出

    可以使用System.out.print(x)将数值x输出到控制台上,这条命令将以x对应的数据类型所允许的最大非0数字位数打印输出x,例如:
double x = 1000.0 / 3.0;
System.out.print(x);
    打印
333.33333333335
    Java沿用了C语言库函数中的printf方法,例如调用
System.out.printf("%8.2f", x);
    就可以用8个字符的宽度和小数点后两个字符的精度打印x.
    在printf中,可以使用多个参数,例如:
System.out.printf("hello, %s, next year, you'll be %d", name, age);
    每一个以%字符开始的格式说明符都用相应的参数替换.
    另外,还可以给出控制格式化输出的各种标志.例如,逗号标志增加了分组的分隔符.
    可以使用静态的String.format方法创建一个格式化的字符串,而不打印输出:
String message = String.format("hello, %s, Next year, you'll be %d"

3.7.3   文件输入与输出

    要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:
Scanner in = new Scanner(Path.get("myfile.txt"));
    如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加上一个额外的反斜杠:"c:\\mydirctory\\myfile.txt".
    要想写入文件,就需要构造一个PrintWriter对象.在构造器中,只需要提供文件名:
PrintWriter out = new PrintWriter("myfile.txt");
    如果文件名不存在,创建该文件.
    注释:如果在命令行方式下用下列命令启动程序:
java MyProg
    启动路径就是命令解释器的当前路径.
    如果已经知道有可能出现"找不到文件"的异常,就应该告知编译器.需要在main方法中使用throws子句标记,如下所示:
public static void main(String[] args) throw FileNotFoundException
{
Scanner in = new Scanner(Paths.get("myfile.txt");
}
    注释:当采用命令行方式启动一个程序时,可以利用重定向将任意文件捆绑到System.in和System.out:
java MyProg < myfile.txt > output.txt
    这样,就不必担心处理FileNotFoundException异常了.
    java.util.Scanner的相关方法如下:
Scanner(File f);
    构造一个从给定文件读取数据的Scanner
Scanner(String data)
    构造一个从给定字符串读取数据的Scanner
PrintWriter(String fileName)
    构造一个将数据写入文件的PrintWriter.文件名由参数指定