2011-03-05 47 views
2

我正在尝试编写一个方法,在命令行中提示用户输入,并将它们的输入作为字符串从标准输入读取并返回。第一次调用它时,正常工作。之后所有对getInput()的调用都不会返回任何内容。从Java系统读取输入问题

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; 
    } 
    // .. 
    } 

回答

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; 
} 
+0

作为一个切线,Java的'Console'类有一个'readPassword'方法,可能比这更安全。 – Max 2016-03-05 19:27:45