你好!今天我们将讨论这个类
PrintStream
以及它能做的一切。 实际上,您已经熟悉了该类的两个方法PrintStream
。这些是您可能每天都会使用的print()
和方法:) 由于变量是一个对象,因此当您调用方法时,您正在调用该特定类的方法。 该类的一般用途是将信息输出到某个流。 这个类有几个构造函数。以下是一些最常见的: println()
System.out
PrintStream
System.out.println()
PrintStream
PrintStream(OutputStream outputStream)
PrintStream(File outputFile) throws FileNotFoundException
PrintStream(String outputFileName) throws FileNotFoundException
PrintStream
,例如,我们想要将数据输出到的文件的名称。或者,对象本身File
。让我们通过示例来看看它是如何工作的:
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
(如果该文件尚不存在)并按boolean
顺序写入我们的数字、字符串和变量。以下是程序运行后文件的内容:
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\\Евгений\\Desktop\\test.txt");
printStream.println("Hello!");
printStream.println("I'm robot!");
printStream.printf("My name is %s, my age is %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, my age is %d!";
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\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
,但 JavaRush 学生不会忘记这个结构:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in
(like 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 = "Hello! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\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
. 它很简单,从名字就可以清楚地看出它是如何工作的:它的数据源是一个字节数组。因此,我们创建相同的字节数组并将其传递给构造函数stream
,构造函数将读取数据。其实一切都已经准备好了!现在我们只需要使用该方法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