Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ganesh_JavaSE7_Programming_1z0-804_study_guide.pdf
Скачиваний:
94
Добавлен:
02.02.2015
Размер:
5.88 Mб
Скачать

Chapter 8

Java I/O Fundamentals

Read and write data from the console

Exam Topics

Use streams to read and write files

In this chapter, we’ll introduce you to the fundamentals of Java I/O programming. We’ll cover two topics: how to read and write data from console, and then how to use (file) streams to read and write data.

Programming with I/O involves writing some exception-handling code as well. If you’re not familiar with the basics of exception handling, such as how to use try-catch-finally blocks or try-with-resources statements, we

recommend that you to read the first three sections in the chapter on exception handling and assertions (Chapter 11) and then return to this chapter.

The support for file manipulation is provided in the java.io and java.nio packages. In the initial part of this chapter, we’ll focus only on the java.io package; later, we’ll focus on reading and writing data using streams (but none of the other features provided in the java.io package. The java.nio package provides comprehensive support for file I/O, and we cover it in Chapter 9). You can use printf-style formatting with the Console class, and this formatting API is covered in detail in Chapter 7.

Reading and Writing from Console

In this section, we’ll discuss reading and writing from the console.

Understanding the Console Class

Using the Console class (which was introduced in Java 1.6) will considerably simplify reading the data from the console and writing the data on the console. Note that the word “console” here refers to the character input device (typically

a keyboard), and the character display device (typically the screen display). You can obtain a reference to the console using the System.console() method; if the JVM is not associated with any console, this method will return null.

225

Chapter 8 Java I/O Fundamentals

Your first exercise is to implement a simple Echo command that prints back the line of text typed as input when you run this program (Listing 8-1).

Listing 8-1.  Echo.java

import java.io.Console;

// simple implementation of Echo command class Echo {

public static void main(String []args) { // get the System console object Console console = System.console(); if(console == null) {

System.err.println("Cannot retrive console object - are you running your application from an IDE? Exiting the application ... ");

System.exit(−1); // terminate the application

}

// read a line and print it through printf console.printf(console.readLine());

}

}

Here is how the program behaves for different output:

D:\>java Echo hello world hello world

D:\>java Echo ^Z

Exception in thread "main" java.lang.NullPointerException

at java.util.regex.Matcher.getTextLength(Matcher.java:1234)

... [this part of the stack trace elided to save space] at Echo.main(Echo.java:14)

For normal text input, this program works fine. If you type no input and try terminating the program with ^z or ^d (Ctrl+Z or Ctrl+D key combinations), then the program receives no input, so the readLine() method returns null; when printf takes a null argument, it throws a NullReferenceException.

Note that you ran this program from the command line. The method System.console() will succeed if the JVM is invoked from a command line without redirecting input or output streams since the JVM will be associated with a console (typically a keyboard and display screen). If the JVM is invoked indirectly by IDE, or if the JVM is invoked from a background process, then the method call System.console() will fail and return null. For example, Figure 8-1 shows what happened when we ran this program from the Eclipse IDE.

226

Chapter 8 Java I/O Fundamentals

Figure 8-1.  System.console() returns null when invoked from Eclipse IDE

In this case, the JVM is not associated with a console (like a command line) since it is invoked from an IDE, so the program failed.

If the JVM is invoked indirectly by IDE, or if the JVM is invoked from a background process, then the method call System.console() will fail and return null.

Some of the important methods available in the Console class are listed in Table 8-1.

Table 8-1.  Important Methods in the Console Class

 

 

 

Method

Short description

Reader reader()

Returns the Reader object associated with this Console object;

 

can perform read operations through this returned reference.

PrintWriter writer()

Returns the PrintReader object associated with this Console

 

object; can perform write operations through this returned

 

reference.

String readLine()

Reads a line of text String (and this returned string object does

 

not include any line termination characters); returns null if it

 

fails (e.g., the user pressed Ctrl+Z or Ctrl+D in the console)

String readLine(String fmt, Object... args)

Same as the readLine() method, but it first prints the string fmt.

char[] readPassword()

Reads a password text and returns as a char array; echoing is

 

disabled with this method, so nothing will be displayed in the

 

console when the password is typed by the user.

char[] readPassword(String fmt,

Same as the readPassword() method, but it first prints the

Object... args)

string given as the format string argument before reading the

 

password string.

Console format(String fmt, Object... args)

Writes the formatted string (created based on values of fmt

 

string and the args passed) to the console.

Console printf(String fmt, Object... args)

Writes the formatted string (created based on values of fmt

 

string and the args passed) to the console. This printf method

 

is the same as the format method: This is a “convenience

 

method”—the method printf and the format specifiers

 

are familiar to most C/C++ programmers, so this method is

 

provided in addition to the format method.

void flush()

Flushes any of the data still remaining to be printed in the

 

console object’s buffer.

 

 

227

Chapter 8 Java I/O Fundamentals

Formatted I/O with the Console Class

The Console class supports formatted I/O in the methods printf() and format() plus the overloaded methods of readPassword() and readLine(). We will not cover the printf() and format() methods in this chapter; they are covered in detail in the “String Formatting” section of Chapter 7.

In the methods readPassword() and readLine(), the first argument is the format specifier string, and the following arguments are the values that will be passed to the format specifier string. These two methods return the character data read from the console. What’s the difference between the readLine() and readPassword() methods? The main difference is that the readPassword() does not display the typed string in the console (for the obvious reason of not displaying the secret password), whereas readLine() displays the input you type in the console. Another minor difference is that the readLine() method returns a String whereas readPassword() returns a char array. See Listing 8-2.

Listing 8-2. Login.java

import java.io.Console; import java.util.Arrays;

// code to illustrate the use of readPassword method class Login {

public static void main(String []args) { Console console = System.console(); if(console != null) {

String userName = null; char[] password = null;

userName = console.readLine("Enter your username: ");

//typed characters for password will not be displayed in the screen password = console.readPassword("Enter password: ");

//password is a char[]: convert it to a String first before comparing contents if(userName.equals("scrat") && new String(password).equals("nuts")) {

//we're hardcoding username and password here for

//illustration, don't do such hardcoding in pratice! console.printf("login successful!");

}

else {

console.printf("restart application and try again");

}

// "empty" the password since its use is over Arrays.fill(password, ' ');

}

}

}

Here is an instance of running this program typing the correct username and password:

D:\>java Login

Enter your username: scrat Enter password:

login successful!

228

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]