2017-02-25 5 views
0

간단한 Java 서버 응용 프로그램을 만들려고하는데 BufferedReader를 사용하여 사용자 입력을 올바르게 읽으려고합니다. 문제는 줄 구분 기호가 CR LF ("\ r \ n") 인 경우에만 발생하므로 readLine() 표준 방법을 사용할 수 없습니다. 내가 얻을 결과 인쇄하려고하면 지금BufferedReader로 CR LF 라인을 읽는 방법?

private String readCRLFLine(BufferedReader in) { 

    StringBuilder result = new StringBuilder(); 
    char cr = 'a'; // initialize cr 
    char lf; 

    try { 
     while (((lf = (char) in.read()) != '\n') && (cr != '\r')) { 
      cr = lf; 
      result.append(lf); 
     } 
     result.deleteCharAt(result.length() - 1); // delete \r from the result 
    } catch (IOException ex) { 
     // handle the exception here 
    } 

    return result.toString(); 
} 

: 따라서, 나는 내 자신의 방법을 구현하기 위해 노력

while ((userMessage = readCRLFLine(inputStream)) != null) { 
     System.out.println(userMessage); 
     break; 
} 

를 ... 그것은 첫 번째 휴식 시간에 문자의 순서를 인쇄 ("\ r"또는 "\ n"), 나머지 입력은 메소드 의 두 번째 호출에 의해 읽혀집니다. readCRLFLine (inputStream) - 이미 다른 입력을 읽어야합니다.

내가 좋아하는 입력을 처리 할 수 ​​있어야합니다 :

"ABC \ rabc \ n 개의 \의 r은 \ ABC \ 연구 \ 없음"이 경우 userMessage에서

은 다음과 같아야합니다

"ABC \ rabc \ n 개의 \ 연구 \ abc 방송"

나는 스캐너를 사용할 수 있으며 "useDeli입니다 TIMEOUT을 "clientSocket.setSoTimeout (TIMEOUT)"으로 설정해야하고 내가 아는 바에 따르면 Scanner에서는이 방법을 사용할 수 없기 때문에 "meter ("\ r \ n ")"메서드를 사용하면됩니다.

내 "readCRLFLine"방법에 어떤 문제가 있습니까? 이 문제에 대한 다른 해결책이 있습니까?

도움을 주시면 감사하겠습니다.

+3

BufferedReader.readLine()이 CRLF를 지원하지 않는다고 생각하는 이유가 무엇입니까? 그렇습니다. 또한 스캐너 또는 다른 클래스에서 소켓 InputStream을 읽었는지 여부에 관계없이 소켓에서 시간 초과를 설정하는 기능은 변경되지 않습니다. –

+0

BufferedReader.readLine() : javadoc에서 "줄 바꿈 ('\ n'), 캐리지 리턴 ('\ r') 또는 캐리지 리턴 중 하나에 의해 종료 된 것으로 간주됩니다. 줄 바꿈. " 내 줄은 "\ r \ n"-> "에 의해 구분됩니다. 따라서"\ n "과"\ r "은 줄 바꿈으로 간주되어서는 안됩니다. – Filco28

+0

@ Filco28 그래서 만약 한 줄에'\ n'이나'\ r'이 하나 있다면 그 줄을 한 줄로보기를 원합니다. 참고 : 대부분의 텍스트 편집기는 이것을 기려하기 때문에 설명하는 내용이 일반 텍스트 파일이 아닙니다. –

답변

1

while 상태가 실제로 필요한 것이 아니기 때문에 사용자의 방법이 올바르지 않습니다.

은 "언제 까지나 현재 읽고있는 문자는 이전 문자가 \r과 다른 \n 다른 한, 읽는 계속"을 말한다.

그러나 \n을 읽을 때 lf != '\n'이 false이므로이 조건은 false입니다. 따라서 처음에는 \n에 멈출 것입니다. \r 다음에 오는 문자도 중지됩니다. cr != '\r'false이므로 결합 된 조건이 false가되기 때문입니다.

현재 문자가 \n이고 이전 문자가 \r 인 경우 루프를 중지하고 싶습니다. 그건 당신의 while 조건이 ! (lf == '\n' && cr == '\r')으로되어 있음을 의미합니다.

DeMorgan의 법칙에주의하십시오. "not (A and B)"는 "A 또는 B가 아님"과 동일합니다. 실수로 OR 대신 AND를 사용하기로 결정했습니다. 로 조건을 변경 : 그건 그렇고

while (((lf = (char) in.read()) != '\n') || (cr != '\r')) { 
    ... 
} 

, 당신은 아마 당신이 char로 변환하고 비교하기 전에 in에서 읽은 값이 음수 아님을 확인해야합니다.음수 값은 클라이언트가 연결을 종료했음을 나타냅니다. 그렇게되면 무한 루프가 발생합니다.

+0

예, 물론 "&&"가 문제였습니다. 왜 내가 그것을 놓쳤는 지 잘 모르겠다. 도와 줘서 고마워. 나는 또한 변환하기 전에 값을 확인합니다. – Filco28