【问题标题】:Java accepts one (1) multiline string from stdinJava 接受来自标准输入的一 (1) 个多行字符串
【发布时间】:2017-03-16 04:22:35
【问题描述】:

我正在编写一个程序,它既可以接受“.sql”文件,也可以接受来自标准输入的 SQL 语句。问题来自标准输入:

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中)后结束。我该怎么做?

【问题讨论】:

  • 那么检查用户是否输入了空字符串?

标签: java stdin


【解决方案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

【讨论】:

    【解决方案2】:

    您提供的代码预计输入将在与Scanner 关联的流的末尾终止,而不是在一行的末尾--看看scanner.nextLine() 调用是如何在@ 内的987654323@循环?

    如果您只想阅读一行,请摆脱循环。此外,如果您没有连接多行,那么您也不需要StringBuilder。但是,请确保这是您想要的,因为 SQL 语句以多行格式编写是相对常见的。

    【讨论】:

    • 注意:文本模式 SQL 接口通常接受多行输入。他们通常会寻找某种分隔符来识别查询的结尾,例如单独一行中的句点或分号。
    • 但是有些sql语句是由多个命令组成的,比如多表插入或者创建一个视图然后从中提取数据
    • @DylanChensky,多个命令不是问题,因为您可以按顺序输入它们。多行 individual 命令是另一回事,如果你想支持这些,那么你有一个基本问题:程序应该如何将给定行识别为命令中的最后一行,而不是期望附加要遵循的路线?我在之前的评论中已经对此说了一两句话。
    猜你喜欢
    • 2014-10-28
    • 2015-03-14
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2019-10-24
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多