你好!今天我们将讨论 Java PrintStream 类及其所有功能。实际上,您已经熟悉PrintStream类的两个方法。它们是print()和println(),您可能每天都在使用它们 :) 因为System.out变量是一个PrintStream对象,所以当您调用System.out.println()时,您正在调用此类的方法之一。 PrintStream类的一般用途是将信息发送到某个流。
这个类有几个构造函数。以下是一些最常用的:

- PrintStream(OutputStream 输出流)
- PrintStream(File outputFile) 抛出 FileNotFoundException
- PrintStream(String outputFileName) 抛出 FileNotFoundException
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Main {
public static void main(String arr[]) throws FileNotFoundException
{
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
filePrintStream.println(222);
filePrintStream.println("Hello world");
filePrintStream.println(false);
}
}
此代码将在桌面上创建一个 test.txt 文件(如果它尚不存在)并依次将我们的数字、字符串和布尔值写入其中。下面是我们运行程序后的文件内容:
222
Hello world!
false
正如我们上面所说,您不必传递File对象。只需将文件路径传递给构造函数就足够了:
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Main {
public static void main(String arr[]) throws FileNotFoundException
{
PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");
filePrintStream.println(222);
filePrintStream.println("Hello world");
filePrintStream.println(false);
}
}
此代码的作用与前面的代码相同。另一个值得我们关注的有趣方法是printf(),它根据格式字符串生成输出。什么是“格式字符串”?让我举个例子吧:
import java.io.IOException;
import java.io.PrintStream;
public class Main {
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");
printStream.println("Hello!");
printStream.println("I'm a robot!");
printStream.printf("My name is %s. I am %d!", "Amigo", 18);
printStream.close();
}
}
在这里,我们没有在字符串中明确说明机器人的姓名和年龄,而是为这些信息放置了占位符,用%s和%d表示。我们将替换它们的数据作为参数传递。在我们的例子中,这是字符串“ Amigo ”和数字 18。我们可以创建另一个占位符,例如%b,并传递另一个参数。我们为什么需要这个? 最重要的是,为了更大的灵活性。 如果您的程序要求您经常显示欢迎消息,您将不得不手动为每个新机器人键入必要的文本。你甚至不能让这个文本成为常量,因为每个人都有不同的名字和年龄!但是使用这个新方法,您可以将问候语隔离在一个常量中,如有必要,只需更改传递给printf()方法的参数即可。
import java.io.IOException;
import java.io.PrintStream;
public class Main {
private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!";
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");
printStream.println("Hello!");
printStream.println("We are robots!");
printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);
printStream.close();
}
}
替换 System.in
在本课中,我们将“对抗系统”并学习如何替换 System.in变量,以便将系统输出重定向到我们想要的任何位置。您可能会忘记System.in是什么,但没有任何 CodeGym 学生会忘记这个结构:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in (就像System.out 一样)是System类的静态变量。但与System.out不同的是,它引用了另一个类,即InputStream。默认情况下,System.in是一个从系统设备(键盘)读取数据的流。但是,就像System.out一样,我们可以将键盘替换为数据源。我们可以从任何地方读取数据!让我们看一个例子:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\n";
byte[] bytes = greetings.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
System.setIn(inputStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = reader.readLine())!= null) {
System.out.println(str);
}
}
}
那么我们做了什么? System.in通常绑定到键盘。但是我们不想从键盘读取数据:让我们从一个普通的字符串中读取数据吧!我们创建了一个字符串并将其作为字节数组获取。为什么我们需要字节?问题是InputStream是一个抽象类,所以我们不能直接创建它的实例。我们必须选择它的后代之一。例如,我们可以选择ByteArrayInputStream。它很简单,光是它的名字就告诉我们它是如何工作的:它的数据源是一个字节数组。所以我们创建一个字节数组并将其传递给将读取数据的 流的构造函数。现在一切都准备好了!现在我们只需要使用 System.setIn ()显式设置in变量值的方法。如果没有out,您会记得,也无法直接设置变量的值:我们必须使用setOut()方法。在我们将我们的 InputStream 分配给System.in变量之后,我们想要检查我们是否达到了我们的目的。我们的老朋友BufferedReader在这里帮了我们的忙。通常,此代码会在 IntelliJ IDEA 中打开控制台,然后读取您从键盘输入的数据。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = reader.readLine())!= null) {
System.out.println(str);
}
但是现在当你运行它时,你会看到我们的字符串只是简单地显示在控制台中。键盘没有读数。我们更换了数据源。它不再是键盘,而是我们的字符串!就这么简单 :) 在今天的课程中,我们了解了一个新类,并探索了一个使用 I/O 的新小技巧。现在是时候返回课程并完成一些任务了 :) 下节课见!
GO TO FULL VERSION