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

Java基本控制台编程-可以使用hasNextLine从控制台读取输入吗?,java,input,console,Java,Input,Console,我收到了这个代码,它看起来很不自然。我通常会使用hasNextLine()而不是布尔变量done,如while循环中的代码所示,但现在我感到困惑。我的问题是,当控制台需要输入时,我可以将变量done显示为hasnetline()的逻辑替换为hasnetline(),还是当输入来自文件时,我只能使用hasnetline()?当输入来自控制台时,通过使用done变量或hasNextLine()实现此代码的更好实践方法是什么?谢谢 // TCPClient.java import java.net.

我收到了这个代码,它看起来很不自然。我通常会使用
hasNextLine()
而不是布尔变量
done
,如
while
循环中的代码所示,但现在我感到困惑。我的问题是,当控制台需要输入时,我可以将变量
done
显示为
hasnetline()
的逻辑替换为
hasnetline()
,还是当输入来自文件时,我只能使用
hasnetline()
?当输入来自控制台时,通过使用
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);
    }
    }
}

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

但如果只是关于是否使用布尔变量,那么另一种选择是:

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

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

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

但如果只是关于是否使用布尔变量,那么另一种选择是:

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

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

在@Voo的解决方案中有一个bug,因为
keyinport
上的
nextLine()
也可能返回
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);
    }
}

当需要从控制台输入时,我是否可以将显示变量done的逻辑替换为
hasnetline()
,或者当输入来自文件时,我是否只能使用
hasnetline()

您可以将任何
输入流
或任何
可读的
(其中
读卡器
是其中的一个子类型)包装在
扫描仪
中,允许您对所有这些文件使用
hasNextLine()
。唯一需要注意的是,
hasNextLine()
可能会无限期地阻止底层流来自控制台、管道、套接字或类似设备的输入

当输入来自控制台时,通过使用
done
变量或
hasNextLine()
实现此代码的更好实践方法是什么

任何一个都可以,正如上面所示的第三个选项一样。这真的是一个品味的问题。。。你认为最简单的。(就我个人而言,我不会使用
Scanner
来调用
hasNextLine()
…但这只是我的观点。)


使用
Scanner
BufferedReader
之间的另一个显著区别是
Scanner
隐藏调用
hasNext…()
时可能发生的任何
IOException
并简单返回
false
。这对于作为轻量级用户输入解析器的
Scanner
的典型用例是一件好事(当您在
keyinport
上使用它时),但在其他用例中可能不是这样。

在@Voo的解决方案中有一个bug,因为
keyinport
上的
nextLine()
也可能返回
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);
    }
}

当需要从控制台输入时,我是否可以将显示变量done的逻辑替换为
hasnetline()
,或者当输入来自文件时,我是否只能使用
hasnetline()

您可以将任何
输入流
或任何
可读的
(其中
读卡器
是其中的一个子类型)包装在
扫描仪
中,允许您对所有这些文件使用
hasNextLine()
。唯一需要注意的是,
hasNextLine()
可能会无限期地阻止底层流来自控制台、管道、套接字或类似设备的输入

当输入来自控制台时,通过使用
done
变量或
hasNextLine()
实现此代码的更好实践方法是什么

任何一个都可以,正如上面所示的第三个选项一样。这真的是一个品味的问题。。。你认为最简单的。(就我个人而言,我不会使用
Scanner
来调用
hasNextLine()
…但这只是我的观点。)


使用
Scanner
BufferedReader
之间的另一个显著区别是
Scanner
隐藏调用
hasNext…()
时可能发生的任何
IOException
并简单返回
false
。这对于作为轻量级用户输入解析器的
Scanner
的典型用例是一件好事(当您在
keyinport
上使用它时),但在其他用例中可能不是这样。

对不起,您的问题与套接字无关。当您在示例程序中使用套接字时,问题是关于控制台输入的(还有公认的答案)。对不起,您的问题与套接字无关。当您在示例程序中使用套接字时,问题是关于控制台输入(以及公认的答案)是的,你是对的,我错了。只是要注意:我们都改变了程序的语义。正确的解决方案是do-while循环。是的,你是对的