【问题标题】:Why this is the delimiter for an SQL file, or a Stream?为什么这是 SQL 文件或流的分隔符?
【发布时间】:2017-11-01 09:39:59
【问题描述】:

我正在阅读一段代码如下:

private String loadAsString(final String path) {
    try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
            Scanner scanner = new Scanner(inputStream)) {
        // '\\A' is the delimiter of .sql file?
        return scanner.useDelimiter("\\A").next();
    } catch (IOException e) {
        throw new RuntimeException("Unable to close input stream.", e);
    }
}

其中 path = "***.sql",表示我电脑上的一个 SQL 文件。

我的问题是为什么使用模式“\A”作为分隔符来结束SQL文件的读取?据我所知,“\A”是 Java 的正则表达式,用于输入的开头但不是结尾。感谢您的帮助。

【问题讨论】:

  • @AMB 这没有回答问题。
  • 这会导致混乱,这正是为什么应该避免这样的“技巧”。这样做没有任何好处;它只会使代码的读者想知道其意图是什么。 "\\z" 也可以正常工作,并且符合代码的意图。
  • @VGR 我尝试使用“\\z”。没用。
  • 我认为其他人已经解释了为什么“\\A”有效。

标签: java


【解决方案1】:

next() 将 (a) 跳过分隔符,然后 (b) 读取字符直到下一个分隔符或 EOF,以先到者为准。

如果分隔符是\A,输入的开始,那么上面的(a)将“跳过” 0-length start-of-input-point,然后(b)读取字符直到下一个输入开始,或 EOF。由于没有任何下一个输入开始,(b) 变为“读取字符直到 EOF”。

扫描仪的标记化基本上提供了与爱丽丝梦游仙境中国王所做的相同的方向:“从头开始,一直到结束:然后停止。”

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2016-10-18
      • 2012-05-28
      相关资源
      最近更新 更多