2017-03-15 1 views
-1

".sql"파일을 사용하거나 표준 입력에서 SQL 문을 수락 할 수있는 프로그램을 작성하고 있습니다. 문제의 형태는 다음과 같습니다.Java는 stdin에서 하나의 다중 행 문자열을 허용합니다.

Scanner scanner = new Scanner(new BufferedInputStream(System.in)); 
System.out.println("Enter SQL statements"); 
StringBuilder stringBuilder = new StringBuilder(); 
while (scanner.hasNext()) { 
    stringBuilder = stringBuilder.append(scanner.nextLine()).append("\n"); 
} 
sqlQuery=stringBuilder.toString(); 

대답은 here에서 수정되었습니다. 그러나 터미널에 문장을 입력하거나 붙여 넣을 때 다음 단계로 넘어 가지 않고 명세서에 "\n"이 계속 추가됩니다. enter (this problem과 유사하지만 Java에서는)을 입력 한 후 사용자 입력을 끝내기를 원합니다. 어떻게해야합니까?

+0

그래서 사용자가 빈 문자열을 입력했는지 확인하십시오. – SLaks

답변

1

두 줄 바꿈 (공백 행)까지 모든 입력을 수집하려면 Scanner에서 정규식을 사용하여 사용자 정의 구분 기호를 설정할 수 있으며 scanner.next()을 한 번 호출하여 입력을 수집합니다.

Scanner scanner = new Scanner(System.in); 

System.out.println("Enter SQL statements"); 

scanner.useDelimiter("\n\n"); // an empty line 
String sqlQuery = scanner.next(); 
scanner.reset(); // resets the delimiter 
1

가 존재하는 코드가 입력이 Scanner가없는 한 행의 끝에서, 연관된 스트림의 끝에 종료 될 것으로 예상 - scanner.nextLine() 호출이 while 루프 내에서 어떻게 보여?

한 줄만 읽으려면 루프를 제거하십시오. 또한 여러 줄을 연결하지 않으면 StringBuilder이 필요하지 않습니다. 그러나 SQL 문을 여러 줄로 작성하는 것이 일반적이기 때문에 원하는 결과를 얻으십시오.

+0

참고 : 텍스트 모드 SQL 인터페이스는 일반적으로 여러 줄 입력을 허용합니다. 그들은 일반적으로 라인의 마침표 나 세미콜론과 같은 쿼리의 끝을 인식하기위한 구분 기호를 찾습니다. –

+0

그러나 일부 SQL 문은 다중 테이블 삽입 또는보기 만들기와 같은 데이터를 추출하는 등 여러 명령으로 구성됩니다. –

+0

@DylanChensky, 여러 명령은 순차적으로 입력 할 수 있으므로 문제가 아닙니다. Multiline * Individual * 명령은 다른 문제이며,이 문제를 지원하려면 근본적인 문제가 있습니다. 예를 들어 명령에서 마지막 줄로 프로그램을 인식하고 추가 줄을 따를 것을 기대할 수 있습니까? 나는 이전에 언급 한 것에 대해 이미 한 두 단어를 말했다. –

관련 문제