Java基本控制台编程 - 可以使用hasNextLine从控制台读取输入吗?

时间:2011-02-19 01:37:19

标签: java input console

我看到这个代码看起来不自然。我通常会使用hasNextLine()而不是布尔变量done,如while循环中的此代码所示,但现在我很困惑。我的问题是,当从控制台输入时,我可以用done替换变量hasNextLine()显示的逻辑吗?或者当输入来自文件时我是否只能使用hasNextLine()?通过使用done变量或hasNextLine(),哪种输入来自控制台,这是实现此代码的更好实践方法?感谢。

// TCPClient.java

import java.net.*;
import java.io.*;
import java.lang.*;

public class TCPClient{

    public static void main(String args[]){
    Socket clientSock=null;
    try{
        int port_num = Integer.valueOf(args[1]).intValue();  //get server's port no.
        clientSock = new Socket(args[0],(int)port_num);  // args[0] is the server host name

        /* String sock=clientSock.toString();
        System.out.println(sock); */

        PrintWriter oStream =
        new PrintWriter(clientSock.getOutputStream(),true);

        BufferedReader iStream =
        new BufferedReader(new InputStreamReader
                   (clientSock.getInputStream()));

        BufferedReader keyInput =
        new BufferedReader(new InputStreamReader(System.in));

        boolean done = false;
        String answer = iStream.readLine();
        if(answer != null)
        System.out.println(answer);

        while(!done){
        String line = keyInput.readLine();
        if(line.trim().equals("BYE"))
            done = true;
        oStream.println(line);
        answer = iStream.readLine();
        if(answer != null)
            System.out.println(answer);
        }

        clientSock.close();
    }catch(Exception e){
        System.out.println(e);
    }
    }
}

2 个答案:

答案 0 :(得分:2)

您的想法和给定的解决方案实现了不同的东西。给定代码保持循环,直到从输入流中获得“BYE”。你的解决方案首先需要一个扫描仪或你自己的hasNextLine()实现,因为BufferedReader没有一个afaik。

但如果它只是关于使用布尔变量,那么替代方案将是:

    String line;
    while(!(line = keyInput.readLine()).trim().equals("BYE")){
    oStream.println(line);
    answer = iStream.readLine();
    if(answer != null)
        System.out.println(answer);
    }

我可以理解那些不喜欢其他语句中的赋值的人,但是我编写了类似的代码来检查变量!= NULL或EOF,因为我发现它更易读。我不会比你现在所做的更复杂,在这种情况下我可能会使用布尔变量。

答案 1 :(得分:2)

@ Voo的解决方案中存在一个错误,因为nextLine()上的keyInput也可以返回null。这是一个更正版本:

String line;
while ((line = keyInput.readLine()) != null && 
       !line.trim().equals("BYE")) {
    oStream.println(line);
    answer = iStream.readLine();
    if (answer != null) {
        System.out.println(answer);
    }
}

  

当从控制台输入时,是否可以用hasNextLine()替换完成变量的逻辑,或者当输入来自文件时,我是否只能使用hasNextLine()

您可以将InputStream或任何Readable(其中Reader是子类型)包裹在Scanner中,以便您在所有hasNextLine()上使用hasNextLine()他们唯一需要注意的是,如果底层流来自控制台,管道,套接字或类似流,done可能会无限期地阻塞等待输入。

  

使用hasNextLine()变量或Scanner

,这是一种实现此代码的更好实践方法,其中输入来自控制台

要么会这样做,如上所示的第三个选项也是如此。这真的是一个品味问题...你认为最简单的东西。 (就我个人而言,我不会使用hasNextLine() ,以便我可以致电Scanner ......但这只是我的意见。)

使用BufferedReaderScanner之间的另一个显着差异是IOException隐藏了hasNext...()调用中可能出现的任何false,并且只返回Scanner。对于keyInput作为轻量级用户输入解析器的典型用例(正如您在{{1}}上使用它),这是一件好事,但在其他用例中可能没有。