2011-02-19 1 views
0

나는이 코드를 내게 부 자연스럽게 보였다. 일반적으로 루프의이 코드에 표시된대로 부울 변수 done보다는 hasNextLine()을 사용하지만 지금은 혼란 스럽습니다. 내 질문은, 콘솔에서 입력이 예상되는 경우 변수 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

죄송합니다. 귀하의 질문은 소켓과 관련이 없습니다. –

+2

예제 프로그램에서 소켓을 사용하는 동안, 질문은 콘솔 입력과 허용 된 응답에 관한 것입니다. –

답변

2

keyInputnextLine()null을 반환 할 수 있기 때문에 @ Voo의 해결책에 버그가 있습니다. 입력 파일에서 올 때

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()를 사용할 수 있습니다 다음은 수정 된 버전입니다 ?

당신은 당신이 그들 모두에 hasNextLine()를 사용할 수 있도록하는 Scanner의 모든 InputStream 또는 Readable (Reader이 하위 유형으로있는)을 포장 할 수 있습니다. 유일한주의 사항은 hasNextLine()이 기본 스트림이 콘솔, 파이프, 소켓 또는 유사한 것으로부터 나오는 경우 입력을 기다리는 것을 막을 수 있다는 것입니다. 변수 done 또는 hasNextLine()를 사용하여 입력 콘솔에서 오는이 코드를 구현하는 좋은 연습 방법이다

?

위의 그림과 같은 세 번째 옵션도 마찬가지입니다. 그것은 정말로 맛의 문제입니다 ... 그리고 당신이 생각하는 것이 가장 단순 해 보입니다. (개인적으로, 나는 hasNextLine()를 호출 할 수 있도록 내가 Scanner단지를 사용하지 않는 게 좋을 ...하지만 그건 그냥 제 생각입니다.)

ScannerBufferedReader를 사용하여 사이의 다른 중요한 차이점은 Scanner 어떤 IOException의 숨 깁니다 것을 그 수도 hasNext...()에 대한 호출에서 발생하며 간단히 false을 반환합니다.이것은 가벼운 사용자 입력 파서 인 (keyInput에서 사용하고있는 것처럼) 일반적인 사용 사례의 경우에는 유용하지만 다른 유스 케이스에서는 그렇지 않을 수도 있습니다.

+0

네 말이 맞아, 나 쿨빠. 그리고 주목할 점 : 우리는 프로그램의 의미를 변경했습니다. 올바른 해결책은 do - while 루프입니다. – Voo

2

그럼 당신의 생각과 주어진 솔루션은 다른 것들을 구현합니다. 주어진 코드는 입력 스트림에서 "BYE"를 얻을 때까지 루프에 남아 있습니다. BufferedReader에는 하나의 afaik가 없기 때문에 솔루션에 먼저 스캐너 또는 hasNextLine()을 구현해야합니다.

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

내가 다른 문에서 할당을 좋아하지 않는 사람들을 이해할 수있는,하지만 난 유사한 코드를 작성했습니다 : 그것은 단지 부울 변수를 사용 여부에 대해 만약

그러나 잘 대안이 될 것이다 ! = NULL 또는 EOF에 대한 변수를 확인하는 것이 더 읽기 쉽다는 것을 알았 기 때문에. 나는 당신이 지금 당장 가지고있는 것보다 훨씬 더 복잡하게 만들지 않을 것이고 나는이 경우 부울 변수와 함께 갈 것입니다.

관련 문제