Java 101:標準の入出力の詳細

以前のJava101の記事では、リダイレクト、標準入力デバイス、および標準出力デバイスの概念について言及しました。データの入力を示すために、と呼ばれるいくつかの例System.in.read()System.in.read()標準の入力デバイスからデータを入力していることがわかります。出力データを示すために、例が呼ばれるSystem.out.print()System.out.println()。とは対照的にSystem.in.read()、これらのメソッド(実行可能コードの名前付きシーケンス(来月の記事で説明))は、出力を標準出力デバイスに送信します。標準のI / Oの概念についてもっと知りたいですか?読む!

標準I / Oは、Unixオペレーティングシステムに由来する標準化された入出力メカニズムです。このメカニズムは主に古い非GUIオペレーティングシステムで使用されますが、標準I / Oは、最新のGUI(グラフィカルユーザーインターフェイス)オペレーティングシステムでも役割を果たしており、誤動作しているプログラムをデバッグしたり、エントリの入出力を教えたりするために使用されます。レベルのプログラミングコース。

ご想像のとおり、標準のI / Oはデータの入出力にデバイスを使用します。これらのデバイスには、標準入力、標準出力、および標準エラーが含まれます。

標準入力

標準的な入力装置は、オペレーティングシステムの一部であるプログラムは、その入力を受ける場所から制御します。デフォルトでは、標準の入力デバイスは、キーボードに接続されたデバイスドライバーからその入力を読み取ります。ただし、入力ソースをファイルに添付されたデバイスドライバーにリダイレクトまたは切り替えることができるため、入力はキーボードではなくファイルから「魔法のように」行われているように見えます。

プログラムは、JavaのSystem.in.read()メソッドを呼び出すことにより、標準の入力デバイスからデータを入力します。 SDKのドキュメントを見ると、というクラスが見つかりますSystem。そのクラスには、in-という変数が含まれていますInputStream。のサブクラスから作成されたオブジェクトです。後にピリオド文字Systemの状態inに属しSystem、そして後にピリオド文字inの状態read()に属しますin。言い換えると、read()は、というオブジェクトに属するメソッドであり、オブジェクトはin、というクラスに属しSystemます。 (クラス、オブジェクト、および「所属」については来月詳しく説明します。)

System.in.read()引数を取らずに整数を返すため、System.in.read()ユーザーが入力した整数を返すと考える人もいます。明確にするために、System.in.read()キーの7ビットASCIIコード(標準入力デバイスがキーボードに設定されている場合)またはファイルから8ビットバイト(標準入力デバイスがキーボードからファイルにリダイレクトされている場合)のいずれかを返します。いずれの場合も、System.in.read()コードを32ビット整数に変換し、結果を返します。

標準の入力デバイスがキーボードに設定されていると仮定します。以下は、Windowsでの動作の説明です。Windows制御のキーボードでキーを入力すると、オペレーティングシステムはそのキーの7ビットASCIIコードを内部キーバッファーに格納します。このキーバッファは最大約16個のASCIIコードを保持し、先入れ先出しの循環キューデータ構造として編成されます。System.in.read()キーバッファの先頭からASCIIコードを取得し、そのコードをキーバッファから削除します。次に、その7ビットASCIIコードは、コードの前に25個のゼロビットを追加intするSystem.in.read()ことによって-に変換され、メソッドの呼び出し元に戻ります。 2番目のSystem.in.read()メソッド呼び出しは、次のASCIIコードを取得します。これは、現在、キーバッファーの先頭にあります。

キーバッファにASCIIコードがないとします。何が起こるのですか?System.in.read()ユーザーがキーを入力してターミネーターを押すのを待ちます。Windowsでは、そのターミネータがEnter重要です。を押すとEnter、Windowsはキャリッジリターンコード(ASCII 13)に続いて改行コード(ASCII 10)をキーバッファに保存します。したがって、キーバッファには、いくつかのASCIIコードと、それに続くキャリッジリターンと改行文字が含まれる場合があります。それらのコードの最初のものはから戻りますSystem.in.read()Echoアプリケーションをキー入力、コンパイル、および実行して、そのアクティビティを確認してください。そのソースコードをリスト1に示します。

リスト1.Echo.java

//Echo.javaクラスEcho {public static void main(String [] args)throws java.io.IOException {int ch; System.out.print( "テキストを入力してください:"); while((ch = System.in.read())!= '\ n')System.out.print((char)ch); }}

Echo 次の手順を完了します。

  1. 引数System.out.print()を取るメソッドを呼び出してString、プロンプトを出力します
  2. System.in.read()標準の入力デバイスからASCIIコードを32ビット整数として入力するための呼び出し
  3. これらの32ビット整数を(char)キャストによって16ビットUnicode文字に変換します
  4. 引数System.out.print()を取るメソッドを呼び出して、charそれらのUnicode文字を標準出力デバイスにエコーします

前の4つのステップの最後の3つのステップは、whileループで実行され、改行文字が読み取られるまで続きます。Echoキーボードから入力して画面に出力するように実行するには、次のコマンドラインを発行しますjava Echo

System.in.read()(その用語の定義については、この記事でワードカウントトピックを参照してください)例外をスローすることはありません標準入力デバイスがキーボードに設定されているときは、キーボードからの標準入力デバイスをリダイレクトするとき、それは例外がスローされることがありますファイル。たとえば、標準入力デバイスをファイルにリダイレクトし、ファイルSystem.in.read()からコンテンツを読み取るとします。ここで、ファイルがフロッピーディスクにあり、ユーザーが読み取り操作中にそのディスクを取り出したとします。イジェクトがSystem.in.read()発生すると、例外がスローされ、ファイルを読み取れないことをプログラムに通知します。これthrows java.io.IOExceptionが、main()メソッドヘッダーに句を追加する理由を提供します。 (今後の記事で、例外、例外のスロー、および関連する概念について説明します。)

入力がファイルから発信されるように、標準入力デバイスをどのようにリダイレクトしますか?答えは<、コマンドラインに小なり記号を導入し、その記号の後にファイル名を付けることです。それがどのように機能するかを確認するには、次のコマンドラインを発行します。java Echo . The command line redirects the standard input device to a file called Echo.java. When Echo runs, because each line ends in a new-line character, only the first line of text in Echo.java appears on the screen.

Suppose you need a utility program that reads an entire file and either displays the file's contents on the screen, copies those contents to another file, or copies those contents to a printer. Unfortunately, the Echo program only performs that task until it encounters the first new-line character. What do you do? The answer to the problem lies in the Type application. Listing 2 provides the source code:

Listing 2. Type.java

// Type.java class Type { public static void main (String [] args) throws java.io.IOException { int ch; while ((ch = System.in.read ()) != -1) System.out.print ((char) ch); } } 

Type resembles Echo, however, there is no prompt, and the while loop tests against -1 (which indicates end of file) instead of \n (which indicates end of line). To run Type, issue the following command line: java Type . The contents of Type.java -- or whatever file is specified -- will display. As an experiment, try specifying java Type. What do you think will happen? (Hint: this program resembles Echo but doesn't end until you press Ctrl+C.)

Earlier, I mentioned that some programmers mistakenly think that System.in.read() returns a user-entered number. As you've just seen, that isn't the case. But what must you do if you want to use System.in.read() to retrieve a number? Take a look at the Convert application, whose source code is presented in Listing 3.

Listing 3. Convert.java

// Convert.java class Convert { public static void main (String [] args) throws java.io.IOException { System.out.print ("Please enter a number: "); int num = 0; int ch; while ((ch = System.in.read ()) != '\n') if (ch >= '0' && ch <= '9') { num *= 10; num += ch - '0'; } else break; System.out.println ("num = " + num); System.out.println ("num squared = " + num * num); } } 

Listing 3's Convert program prompts the user to enter a number (via System.out.print ("Please enter a number: ");). It reads these digits -- one at a time -- and converts each digit's numeric code to a binary number that is added to a variable called num. Finally, calls to System.out.println() output the value inside num and the square of that value to the standard output device.

Convert demonstrates the time-honored technique of using a while loop to test for a digit, premultiplying a variable by 10 (to make room for the incoming digit), converting a digit to its binary equivalent, and adding that binary equivalent to the variable. However, that technique is not a sound technique to use if you're writing a program for deployment in different countries as some countries use digits other than 0 through 9 -- such as Tamil digits. To make the program operate with other digits, you need to expand the if statement to test for those digits and modify the ch - '0' expression. Fortunately, Java simplifies that task by providing a Character class, which you'll explore in a future article.

Standard output

The standard output device is that part of the operating system that controls where a program sends its output. By default, the standard output device sends the output to a device driver attached to the screen. However, the output destination can be redirected to a device driver attached to a file or printer, which results in the same program displaying its findings on the screen, saving them in a file, or providing a hardcopy listing of the results.

You achieve standard output by calling Java's System.out.print() and System.out.println() methods. Except for the fact that print() methods don't output a new-line character after the data, the two method groups are equivalent. Methods exist to output Boolean, character, character array, double-precision floating-point, floating-point, integer, long integer, string, and object values. To demonstrate these methods, Listing 4 presents source code to the Print application.

Listing 4. Print.java

// Print.java class Print { public static void main (String [] args) { boolean b = true; System.out.println (b); char c = 'A'; System.out.println (c); char [] carray = { 'A', 'B', 'C' }; System.out.println (carray); double d = 3.5; System.out.println (d); float f = -9.3f; System.out.println (f); int i = 'X'; System.out.println (i); long l = 9000000; System.out.println (l); String s = "abc"; System.out.println (s); System.out.println (new Print ()); } } 

Listing 4 has probably triggered some questions for you. First, what is all that System.out. business doing in front of println()? Again, refer to the System class in the SDK documentation. The class contains a variable called out -- an object created from a class called PrintStream. The period character after System indicates that out belongs to System. The period character after out states that println() belongs to out. In other words, println() is a method that belongs to an object called out, which in turn belongs to a class called System.

The second question you might be asking yourself involves println() argument data types: how is it possible for the same println() method to be called with different types of argument data? The answer: because there are several println() methods in the PrintStream class. At runtime, the JVM knows which println() method to call by examining the number of method-call arguments and their data types. (Declaring several methods with the same name but different numbers of arguments and argument data types is known as method overloading. I will discuss that concept next month.)

Finally, you might be wondering about System.out.println (new Print ());. That method call illustrates the println() method, which takes an Object argument. First, the creation operator new creates an object from the Print class and returns a reference to -- also known as the address of -- that object. Finally, that address passes as an argument to the println() method, which takes an Object argument. The method converts the object's contents to a string and outputs that string. By default, the string consists of the name of the object's class, followed by an @ (at) character, followed by a hexadecimal-formatted integer that represents the object's hashcode. (I will present hashcodes and the conversion of objects to strings in an upcoming article.)

Compile Print.java and run the program by issuing the following command line: java Print. You should see nine lines of output. Redirect that output to the out.dat file by issuing the following command line: java Print >out.dat. You can now view the contents of the file.

The greater-than sign, >, indicates standard output redirection. Whenever you want to redirect the standard output device from the screen to a file or printer, specify that symbol followed by the file or printer name on the command line. For example, redirect Print's output to a Windows printer by issuing the following command line: java Print >prn.