2011-02-19 50 views
0

我已经看到这段代码,看起来不自然。我通常使用hasNextLine()而不是布尔变量done,如while循环中的代码所示,但现在我很困惑。我的问题是,当我希望从控制台输入时,可以替换显示变量done的逻辑与hasNextLine(),还是只能在输入来自文件时使用hasNextLine()?在输入来自控制台的情况下,使用done变量或hasNextLine()来实现此代码是一种更好的练习方法?谢谢。Java基本控制台编程 - 可以使用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

对不起,你的问题与套接字无关。 – 2011-02-19 01:52:57

+2

在示例程序中使用套接字时,问题是关于控制台输入(以及接受的答案)。 – 2011-02-19 02:25:12

回答

2

@ Voo的解决方案中存在一个错误,因为keyInput上的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); 
    } 
} 

我能代替地方做的变量被显示为hasNextLine()当输入从控制台预期的逻辑,或者我只能用hasNextLine()当输入来自文件?

您可以在Scanner包裹InputStream或任何Readable(其中Reader是一种亚型)的任何,让您在所有设备上的使用hasNextLine()。唯一的警告是hasNextLine()可能会无限期地等待输入,如果基础流来自控制台,管道,套接字或类似的。

这是实现这个代码,其中输入来自控制台,通过使用done变量或hasNextLine()的一个更好的做法呢?

要么这样做,就像上面的第三个选项一样。这真的是一种品味......而你认为看起来最简单。 (个人而言,我不使用Scanner只是,这样我可以调用hasNextLine() ...但是这只是我的看法。)

使用ScannerBufferedReader之间的其他显著不同的是,Scanner隐藏任何IOException s表示可能发生在致电hasNext...()并且仅返回false。对于Scanner的典型使用案例,这是一件好事,因为它是轻量级用户输入解析器(正如您在keyInput上使用的那样),但在其他使用情况下可能不会。

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,因为我发现它更好的可读性。尽管如此,我不会让它变得比现在更复杂,我可能会在这种情况下使用布尔变量。