【问题标题】:Java equivalent of C#'s verbatim strings with @Java 等价于带有 @ 的 C# 逐字字符串
【发布时间】:2026-01-19 05:45:01
【问题描述】:

快速提问。在 Java 中是否有与 @ 等效的字符串:

例如,我可以在 C# 中执行 @"c:\afolder\afile" 并让它在处理时忽略转义字符,而不必执行 "c:\\afolder\\aFile"。是否有 Java 等价物?

hmmm:* 正在逃避我.. 哈哈。第二个例子应该是:

c:(双反斜杠)文件夹(双反斜杠)aFile

【问题讨论】:

  • 冒昧地澄清了标题,因为@ 也可用于将语言关键字用作标识符。
  • @unicornaddict - 是的,确实是同一个问题。抱歉,搜索时没有看到。 @ Johannes - 好举动..谢谢
  • 如果您只想在 Windows 中执行此操作,并且使用的是 Windows XP 或更新版本(您应该这样做!),那么您可以执行 File file = new File("C:/afolder/afile ");另一方面,如果你想更便携,你应该看看@CPerkins 的优秀答案。
  • 注意(2018 年 1 月),Java(JDK 10 或更高版本)可能会出现原始字符串文字:请参阅 In Java, is there a way to write a string literal without having to escape quotes?

标签: c# java string literals


【解决方案1】:

No。转义/外部化字符串是您唯一的选择。

【讨论】:

  • 我喜欢带有 @"string" 和 $"string{i}" 的 c# 6,而且比 java 更具有未来性
  • 从 C# 到 Java,在很多方面都经常下降
【解决方案2】:

不,Java 没有verbatim string literals

如果您想要一种类似 Java(和基于 Java-VM)的语言,可以,但是,您可能需要查看具有 various forms of string literalGroovy

【讨论】:

  • 第一个链接(逐字字符串文字)指向 “Visual Studio 2003 已停用的技术文档” groovy.codehaus.org 链接已损坏
  • @ace:更新到当前的“字符串”文章,其中包括逐字字符串文字的部分。还更新了 Groovy 链接。
【解决方案3】:

正如肯特和乔恩所说,不,没有。

我的回答只是为了指出,即使有,对于您的特定情况,在一般情况下,假设一个不止一次性的程序,这将是一个坏主意。

Java 程序可以在比 Windows 更多的平台上运行,并且其他平台具有不同的文件分隔符。因此,处理您的特定示例的正确方法是获取文件分隔符属性,而不是处理转义的反斜杠:


    String sep = System.getProperty("file.separator");
    String filename = ROOTDIR + sep + "folder" + sep + "afile";

您将根据某些策略单独创建 ROOTDIR - 不仅是平台,而且您是否希望“文件”相对于实际的文件系统根目录,或相对于用户的主目录。

但毫无疑问,使用文件分隔符属性可以让您的程序更广泛地使用。工作量更大吗?是的。正如 Wanda Sykes 所说,“但这是值得的”。

【讨论】:

  • 嗨,谢谢。事实上,在我的情况下,它是一个“文件名”,有点无关紧要。我的所有代码正在做的就是获取一个字符串(或尝试)并将其传递。除了将它传递给 Web 服务之外,我实际上并没有对它做任何事情。我正在测试从 Java 调用的 c# WCF 服务的响应。由于我只是对测试进行硬编码,因此我发现了这个限制。我实际上并没有用字符串做任何“基于文件”的事情。
  • 逐字字符串非常适合正则表达式模式。
【解决方案4】:

目前它在 Java 中不受支持,但可能会在未来的版本中提供。 JEP 326: Raw String Literals 创建于 2018/01/23

https://bugs.openjdk.java.net/browse/JDK-8196004查看进度

也许有一天你可以做到:

`c:\afolder\afile`

更新: JEP 提议从 JDK 12:326 中删除:原始字符串文字(预览版) 你可以在这里阅读理由:http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html

更多细节在这里https://bugs.openjdk.java.net/browse/JDK-8215682

底线:在不久的将来,Java 中不会出现逐字字符串。即使它会出现,它也不会是``。

【讨论】:

【解决方案5】:

Java 从 2019 年 9 月开始使用它,但它使用了不同的 sintax。 “””(三个双引号)。

*在较新的 java 版本中(预览版 +13,生产就绪 +15),使用 java 文本块可以实现大部分等效。

String html = """         
            <xml>
                <ody>
                    <pan>example xml </pan>
                </ody>
            </xml>""";

https://docs.oracle.com/en/java/javase/13/text_blocks/index.html 上的文档

【讨论】:

  • 这应该被接受为正确答案。
最近更新 更多