CodeGym /Java 博客 /随机的 /Java PrintStream 类
John Squirrels
第 41 级
San Francisco

Java PrintStream 类

已在 随机的 群组中发布
你好!今天我们将讨论 Java PrintStream 类及其所有功能。实际上,您已经熟悉PrintStream类的两个方法。它们是print()println(),您可能每天都在使用它们 :) 因为System.out变量是一个PrintStream对象,所以当您调用System.out.println()时,您正在调用此类的方法之一。  PrintStream类的一般用途是将信息发送到某个流。 为什么我们需要 PrintStream 类 - 1这个类有几个构造函数。以下是一些最常用的:
  • PrintStream(OutputStream 输出流)
  • PrintStream(File outputFile) 抛出 FileNotFoundException
  • PrintStream(String outputFileName) 抛出 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 文件(如果它尚不存在)并依次将我们的数字、字符串和布尔值写入其中。下面是我们运行程序后的文件内容:

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 的新小技巧。现在是时候返回课程并完成一些任务了 :) 下节课见!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION