자바 101 : 표준 입 / 출력의 내용

이전 Java 101 기사에서 리디렉션, 표준 입력 장치 및 표준 출력 장치의 개념을 언급했습니다. 데이터 입력을 설명하기 위해 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주 뒤의 마침표 문자 및에 속한 상태 뒤의 마침표 문자 . 즉, 은라는 객체에 속하는 메서드이며이라는 클래스에 속합니다 . (다음 달에 클래스, 객체 및 "소속"에 대해 자세히 논의 할 것입니다.)inSysteminread()inread()inSystem

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 코드는 코드에 0 비트 25 개 intSystem.in.read()추가 하여로 변환 하고 메서드 호출자에게 반환합니다. 두 번째 System.in.read()메서드 호출은 이제 키 버퍼의 헤드에있는 다음 ASCII 코드를 검색합니다.

키 버퍼에 ASCII 코드가 없다고 가정합니다. 무슨 일이야? System.in.read()사용자가 키를 입력하고 종료자를 누를 때까지 기다립니다. Windows에서는 종료자가 Enter핵심입니다. 키를 누르면 EnterWindows에서 캐리지 리턴 코드 (ASCII 13)와 새 줄 코드 (ASCII 10)를 키 버퍼에 저장합니다. 따라서 키 버퍼에는 캐리지 리턴과 개행 문자가 뒤 따르는 여러 ASCII 코드가 포함될 수 있습니다. 첫 번째 코드는 System.in.read(). Echo애플리케이션 을 입력하고 컴파일하고 실행하여 활동을 확인하십시오 . 소스 코드는 목록 1에 나와 있습니다.

목록 1. Echo.java

// Echo.java class 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. (char)캐스트 를 통해 해당 32 비트 정수를 16 비트 유니 코드 문자로 변환합니다.
  4. 해당 유니 코드 문자를 표준 출력 장치에 에코하기 System.out.print()위해 char인수를 받는 메서드를 호출합니다.

이전 네 단계의 마지막 세 단계는 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.