Skip to Content

Java打印流&标准输入输出

打印流

平时在控制台的打印输出是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。继承于java.io.OutputStream

PrintStream类

构造方法

  • public PrintStream(String fileName):使用指定的文件名创建一个新的打印流。(输出的目的地是一个文件路径)
  • public PrintStream(File file):创建具有指定文件且不带自动行刷新的新打印流。(输出的目的地是一个文件)
  • public PrintStream(OutputStream out):创建新的打印流。(输出的目的地是一个字节输出流)
PrintStream ps = new PrintStream("ps.txt");

改变打印流向

System.out就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上。因为是流对象,可以通过System.setOut(PrintStream ps)方法改变它的流向。

  • System.setOut(PrintStream ps):改变改变打印流的流向,将输出的数据打印到指定的位置。
public static void main(String[] args) throws IOException { // 调用系统的打印流,控制台直接输出97 System.out.println(97); // 创建打印流,指定文件的名称 PrintStream ps = new PrintStream("ps.txt"); // 设置系统的打印流流向,输出到ps.txt System.setOut(ps); // 调用系统的打印流,ps.txt中输出97 System.out.println(97); }

还原打印流向

还原打印流向可以先创建一个PrintStream对象保存原有的System.Out,还原时使用该对象还原。

public static void main(String[] args) throws FileNotFoundException { //先创建一个PrintStream对象保存原有的流向 PrintStream out = System.out; //此时打印输出语句还在系统中 System.out.println("第一句话!"); //创建有地址的PrintStream对象 PrintStream ps = new PrintStream("E:\\123.txt"); //将流向设置为文件 System.setOut(ps); //此时打印的输出语句流向至文件中 System.out.println("第二句话!"); //还原流向 System.setOut(out); //此时的输出语句打印在系统中,已经还原 System.out.println("第三句话!"); }

如果使用继承自父类的write方法写数据,在查看数据的时候会查询编码表(97→a)。 如果使用自己特有方法print/println方法写数据,将原样输出(97→97)。

PrintWriter类

构造方法

  • public PrintWriter(String fileName):使用指定的文件名创建一个新的打印流。(输出的目的地是一个文件路径)
  • public PrintWriter(File file):创建具有指定文件且不带自动行刷新的新打印流。(输出的目的地是一个文件)
  • public PrintWriter(OutputStream out):创建新的打印流。(输出的目的地是一个字符输出流)
PrintWriter ps = new PrintWriter(new FileWriter("E:\\ps.txt"));

标准输入输出流

java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。

标准输入流

System.in表示的是标准输入流,从键盘输入。

在Java中,要想通过控制台进行输入,首先需要构造一个Scanner对象,并与标准输入流 System.in关联。

  • System.in的编译类型是InputStream
  • System.in的运行类型是BufferedInputStream

Scanner类常用方法:

  • Scanner (InputStream in):用给定的输入流创建一个 Scanner 对象。
  • String nextLine():读取输入的下一行内容。
  • String next():读取输入的下一个单词(以空格作为分隔符。)
  • int nextlnt():读取并转换下一个表示整数的字符序列。
  • double nextDouble():读取并转换下一个表示浮点数的字符序列。
  • boolean hasNext():检测输入中是否还有其他单词。
  • boolean hasNextInt():检测是否还有表示整数的下一个字符序列。
  • boolean hasNextDouble():检测是否还有表示浮点数的下一个字符序列。
// 创建Scanner构造函数,并传入参数 Scanner in = new Scanner(System.in); // nextLine 方法将输入一行,这一行中可以包含空格 System.out.print("What is your name? "); String name = in.nextLine(); // 读取一个单词(以空白符作为分隔符) String firstName = in.next(); // 要想读取一个整数 System.out.print("How old are you? "); int age = in.nextlnt();

标准输出流

System.out表示的是标准输出流,将数据输出到显示器。

在Java中,可以使用System.out.print(x)将数值 x 输出到控制台上。如果希望显示美元、美分等符号, 则有可能会出现问题。

  • System.out的编译类型是OutputStream
  • System.out的运行类型是BufferedOutputStream

Java SE 5.0 沿用了C语言库函数中的printf方法。例如,调用 System.out.printf("%8.2f", x); 可以用 8 个字符的宽度和小数点后两个字符的精度打印 x。比如,10000.0 / 3.0,则打印3333.33

printf中,可以使用多个参数, 例如:System.out.printf("Hello, %s. Next year, you'll be %d", name, age); 每一个以 % 字符开始的格式说明符都用相应的参数替换。

还可以给出控制格式化输出的各种标志。例如,逗号标志增加了分组的分隔符。Systen.out.printf("%,.2f", 10000.0 / 3.0);打印3,333.33

转换符类型
d十进制整数
x十六进制整数
o八进制整数
f定点浮点数
e指数浮点数
g通用浮点数
a十六进制浮点数
s字符串
c字符
b布尔
h散列码
tx 或 Tx日期时间(T强制大写)已经过时,应当改为使用java.time 类
%百分号
n与平台有关的行分隔符

还可以给出控制格式化输出的各种标志。表 3-6 列出了所有的标志。例如,逗号标志增加了分组的分隔符。 即

Systen.out.printf("%,.2f", 10000.0 / 3.0); // 打印 3,333.33
标志描述
+打印正数和负数的符号
空格在正数之前添加空格
0数字前面补 0
-左对齐
(将负数括在括号内
,添加分组分隔符
# (对于 f 格式)包含小数点
# (对于 0x 或 0 格式)添加前缀 0x 或 0
$给定被格式化的参数索引。例如 %1$d%1$x 将以十进制和十六进制格式打印第 1 个参数
<格式化前面说明的数值。 例如%d%<x 以十进制和十六进制打印同一个数值

可以使用静态的 String.format 方法创建一个格式化的字符串, 而不打印输出:

String message = String.format("Hello, %s. Next year, you'll be %d", name , age);

Last updated on