从Java System.in发出读取输入

时间:2011-03-05 06:06:23

标签: java io

我正在尝试编写一个方法,提示用户在命令行输入并从stdin读取其输入为String并返回。第一次调用它时,一切正常。之后对getInput()的所有调用都不会返回任何内容。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Prompts the user for input and reads from standard input (stdin).
 * Note: Always check if the return is null!
 * 
 * @param description Describes the user input.
 * @return A String of the input, or null when failed.
 */
private String getInput(String description)
{       
    System.out.print(description + ": ");
    String input = null;

    InputStreamReader stream = null;
    BufferedReader reader = null;
    try {
        // Open a stream to stdin
        stream = new InputStreamReader(System.in);

        // Create a buffered reader to stdin
        reader = new BufferedReader(stream);

        // Try to read the string
        input = reader.readLine();

        // Exhaust remainder of buffer
        while (reader.skip(1) > 0) {
            // Do nothing
        }

    } catch (IOException e) {
        e.printStackTrace();
        // Error reading input

    } finally {
        // Clean up readers and streams
        try {
            if (reader != null) {
                reader.close();
            }
            if (stream != null) {
                stream.close();
            }
        } catch (IOException e) {
        }
    }

    System.out.print("\n");
    return input;
}

/**
 * Display the login prompt.
 */
private boolean promptLogin()
{       
    // prompt for user name and password
    String user = getInput("Enter username");
    String pass = getInput("Enter password");

    if (user == null || pass == null) {
        System.out.println("Invalid login information.");
        return false;
    }
    // ..
     }

1 个答案:

答案 0 :(得分:9)

您不得关闭标准输入流;这就是它第一次工作的原因

/**
 * Prompts the user for input and reads from standard input (stdin).
 * Note: Always check if the return is null!
 * 
 * @param description Describes the user input.
 * @return A String of the input, or null when failed.
 */
private String getInput(String description) {
    System.out.print(description + ": ");
    String input = null;

    InputStreamReader stream = null;
    BufferedReader reader = null;
    try {
        // Open a stream to stdin
        stream = new InputStreamReader(System.in);

        // Create a buffered reader to stdin
        reader = new BufferedReader(stream);

        // Try to read the string
        input = reader.readLine();           
    } catch (IOException e) {
        e.printStackTrace();
    } 

    return input;
}

/**
 * Display the login prompt.
 */
private boolean promptLogin() {
    // prompt for user name and password
    String user = getInput("Enter username");
    String pass = getInput("Enter password");

    if (user == null || pass == null) {
        System.out.println("Invalid login information.");
        return false;
    }

    return true;
}