こんにちは!今日は、クラス
PrintStream
とクラスでできることすべてについて説明します。 実際、あなたはすでに クラス の 2 つのメソッドに精通しています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);
}
}
このコードは前のコードと同じことを行います。注目すべきもう 1 つの興味深い方法は、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
システム出力を必要な場所にリダイレクトする方法を学びます。 それが何であるかを忘れたかもしれませんSystem.in
が、JavaRush の学生はこの構造を決して忘れることはありません。
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 = "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