やあ!今日は、Java PrintStream クラスとそれができることすべてについて説明します。実際、 PrintStreamクラスの 2 つのメソッドについてはすでにご存知でしょう。それらはprint()とprintln()で、おそらく毎日使用するでしょう :) System.out変数はPrintStreamオブジェクトであるため、 System.out.println()を呼び出すときにこのクラスのメソッドの 1 つを呼び出すことになります。 PrintStreamクラスの一般的な目的は、情報をストリームに送信することです。
このクラスには複数のコンストラクターがあります。最も一般的に使用されるもののいくつかを次に示します。
これですべての準備が整いました。あとはSystem.setIn()を使用するだけです。in変数の値を明示的に設定するメソッド。を使用しないと、変数の値を直接設定することもできなかったことを思い出してください。setOut()メソッドを使用する必要がありました。InputStream をSystem.in変数に割り当てた後、目的が達成されたかどうかを確認したいと思います。ここで私たちの旧友であるBufferedReaderが助けてくれます。通常、このコードは IntelliJ IDEA でコンソールを開き、キーボードから入力したデータを読み取ります。

- PrintStream(出力ストリーム出力ストリーム)
- 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);
}
}
このコードは前のコードと同じことを行います。注目に値するもう 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\\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を選択できます。これはシンプルで、その名前だけでどのように機能するかがわかります。そのデータ ソースはバイト配列です。そこで、バイト配列を作成し、それをデータを読み取る ストリームのコンストラクターに渡します。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