简体   繁体   中英

System.out.println print at the same time

I'm building a simple program that executes a single command to a linux server using Ganymed for SSH2 library. Here is my code...

public class Main {

static Scanner reader = new Scanner(System.in);


public static void main(String[] args) throws IOException, InterruptedException{        


    String hostname; // = "192.168.1.241";
    int port; // = 22
    String username; // = "root";
    String password; 
    String cmd; // = "echo 'Hello World'";

    //ask user for hostname/IP
    System.out.print("Enter hostname or IP: ");
    hostname = reader.nextLine();


    //ask user for port #
    System.out.print("Enter port number: ");
    port = reader.nextInt();        

        //create connection
        Connection connect = new Connection(hostname, port);

    //ask user for username
    System.out.println("Enter Username (best to use 'root'): ");
    username = reader.nextLine();

    //ask user for password
    System.out.println("Enter Password: ");
    password = reader.nextLine();   


    System.out.println("Attempting to log in...");

    reader.close(); 

        //establish connection
        connect.connect();

        //login using password
        connect.authenticateWithPassword(username, password);

        Thread.sleep(1000);
        if (Thread.interrupted())  // Clears interrupted status!
              throw new InterruptedException();

        Boolean didConnect = connect.isAuthenticationComplete();
        if (didConnect==false){
            throw new IOException("Authentication Unsucessful \nCheck hostname and port number, then try again.");
        }

            //open session
            Session session = connect.openSession();
            System.out.println("Opened session!");              




        System.out.println("Enter a command to execute: ");
        cmd = reader.nextLine();

        //execute command
        session.execCommand(cmd);


        //get output
        InputStream stdout = new StreamGobbler(session.getStdout());

        BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

        String line = br.readLine();
        if (line!=null){
            System.out.println("Command sent succesfully!" + "\nOutput: " + "\n" + "\n" + line);
        }else{
            System.out.println("Command sent succesfully!" + "\nNo Output");
        }

        //close buffered reader
        br.close();

        //close session
        session.close();

        //close connection
        connect.close();


    }



}

For some reason...

//ask user for username
    System.out.println("Enter Username (best to use 'root'): ");
    username = reader.nextLine();

    //ask user for password
    System.out.println("Enter Password: ");
    password = reader.nextLine();   

print at the same time and I don't know why! It also gets the user input on a completely different line instead of right next to it when using print ln and on the same line when using print .

I want them to ask for the username first and then for password, putting the user input next to the output. However, when I ask for the hostname and port number they print individually/in order, like I want it to. What am I doing wrong?

After you do port = reader.nextInt(); , you need to place a reader.nextLine() to read the rest of the line(and newline character) which has the int.

//ask user for port #
System.out.print("Enter port number: ");
port = reader.nextInt();        

reader.nextInt() doesn't read newline or anything after the number.

Add reader.nextLine() then the rest of the code should follow:

reader.nextLine();

//ask user for username
System.out.println("Enter Username (best to use 'root'): ");
username = reader.nextLine();

//ask user for password
System.out.println("Enter Password: ");
password = reader.nextLine();

Your problem is that you're using the same Scanner object multiple times to read a line. It skips the code:

 //ask user for username
System.out.println("Enter Username (best to use 'root'): ");
username = reader.nextLine();

//ask user for password
System.out.println("Enter Password: ");
password = reader.nextLine();

because the object already has a value for the method you're calling.

Solution: re-instantiate the object every time you use it:

reader = new Scanner(System.in);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM