来自Perl,我肯定错过了“here-document”在源代码中创建多行字符串的方法:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
在Java中,我必须在每一行都有繁琐的引号和加号,因为我从头开始连接多行字符串 .
有哪些更好的选择?在属性文件中定义我的字符串?
Edit :两个答案说StringBuilder.append()优于加号表示法 . 任何人都可以详细说明他们为什么这么认为?它并没有找到解决多线字符串不是一流语言构造这一事实的方法,这意味着我绝对不希望用方法调用替换第一类语言构造(字符串连接加上) .
Edit :为了进一步澄清我的问题,我关注可维护性和设计问题 .
30 回答
在Eclipse中,如果打开选项"Escape text when pasting into a string literal"(在“首选项”>“Java”>“编辑器”>“键入”中)并在引号中粘贴多行字符串,它将自动为所有行添加
"
和\n" +
.在IntelliJ IDE中,您只需键入:
然后将光标放在引号内并粘贴您的字符串 . IDE将把它扩展为多个连接行 .
您可以使用与java兼容的scala-code,并允许使用“”“括起来的多行字符串:
(注意字符串中的引号)和java:
这是否更舒服......?
另一种方法,如果你经常处理长文本,它应放在你的源代码中,可能是一个脚本,它从外部文件中获取文本,并将其作为multiline-java-String包装,如下所示:
这样您就可以轻松地将其剪切并粘贴到源中 .
String.join
Java 8为
java.lang.String
添加了一个新的静态方法,它提供了一个更好的替代方案:String.join( CharSequence delimiter , CharSequence... elements )
使用它:
这是一个旧的线程,但是一个新的非常优雅的解决方案(只有4个小缺点)是使用自定义注释 .
检查:http://www.adrianwalker.org/2011/12/java-multiline-string.html
受这项工作启发的项目在GitHub上托管:
https://github.com/benelog/multiline
Java代码示例:
缺点是
您必须激活相应的(提供的)注释处理器 .
表示String变量不能定义为局部变量 .
该String不能包含其他变量,如Visual Basic .Net with XML literal(
<%= variable %>
):-)字符串文字由JavaDoc注释(/ **)分隔
您可能必须将Eclipse / Intellij-Idea配置为不自动重新格式化您的Javadoc注释 .
有人可能会发现这很奇怪(Javadoc注释并不是为了嵌入除注释之外的其他内容),但由于Java中缺少多行字符串最终会让人烦恼,我发现这是最差的解决方案 .
实际上,以下是迄今为止我见过的最干净的实现 . 它使用注释将注释转换为字符串变量...
因此,最终结果是变量html包含多行字符串 . 没有引号,没有加号,没有逗号,只是纯粹的字符串 .
此解决方案可从以下URL获得... http://www.adrianwalker.org/2011/12/java-multiline-string.html
希望有所帮助!
我还没有看到答案的另一个选择是java.io.PrintWriter .
此外,没有提到java.io.BufferedWriter具有
newLine()
方法的事实 .我知道这是一个老问题,但是对于有兴趣的开发人员来说,多行文字将会出现在#Java12中
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
听起来你想要做一个多线文字,这在Java中是不存在的 .
你最好的选择将是一起只是
+
'd的字符串 . 人们提到的其他一些选项(StringBuilder,String.format,String.join)只有在你开始使用字符串数组时才会更好 .考虑一下:
与
StringBuilder
:与
String.format()
:与Java8 String.join():
如果您想要特定系统的换行符,您需要使用
System.getProperty("line.separator")
,或者您可以在String.format
中使用%n
.另一种选择是将资源放在文本文件中,然后只读取该文件的内容 . 这对于非常大的字符串来说是首选,以避免不必要地膨胀您的类文件 .
如果在属性文件中定义字符串,它看起来会更糟糕 . IIRC,它看起来像:
通常,不将大字符串嵌入到源代码中是一个合理的想法 . 您可能希望将它们作为资源加载,可能是XML或可读文本格式 . 文本文件可以在运行时读取,也可以编译为Java源代码 . 如果你最终将它们放在源代码中,我建议将
+
放在前面并省略不必要的新行:如果您有新行,您可能需要一些连接或格式化方法:
如果你像我一样喜欢谷歌的 Guava ,它可以提供一个相当干净的表示和一个很好的,简单的方法来不硬编码您的换行符:
将两个字符串转换为StringBuilder.append,除非两个字符串都是常量,因此编译器可以在编译时将它们组合在一起 . 至少,这就是Sun的编译器中的情况,如果不是所有其他编译器都会这样做,我会怀疑大多数编译器 .
所以:
通常生成完全相同的代码:
另一方面:
是相同的:
也就是说,在多行中打破你的字符串文字没有任何惩罚,加号为可读性 .
属性文件中不允许使用多行字符串 . 您可以在属性文件中使用\ n,但我不认为这在您的情况下是一个很大的解决方案 .
使用
Properties.loadFromXML(InputStream)
. 不需要外部库 .比杂乱的代码更好(因为可维护性和设计是您的关注点),最好不要使用长字符串 . 首先阅读xml属性:
然后你可以 more maintainable 方式使用你的多线字符串...
MultiLine.xml`位于同一文件夹YourClass中:
PS . :您可以使用
<![CDATA["
..."]]>
用于类似xml的字符串 .一个非常有效且独立于平台的解决方案是使用行分隔符的系统属性和StringBuilder类来构建字符串:
您可以使用单独的方法连接附加内容,例如:
无论哪种方式,更喜欢
StringBuilder
加号表示法 .我建议使用ThomasP建议的实用程序,然后将其链接到您的构建过程 . 仍然存在外部文件以包含文本,但在运行时不读取该文件 . 然后工作流程为:
构建'textfile to java code'实用程序并检查版本控制
在每个构建中,针对资源文件运行该实用程序以创建修订的Java源
Java源代码包含一个类似
class TextBlock {...
的标头,后跟一个静态字符串,该字符串是从资源文件自动生成的使用其余代码构建生成的java文件
遗憾的是,Java没有多行字符串文字 . 您必须连接字符串文字(使用或StringBuilder是两种最常用的方法)或从单独的文件中读取字符串 .
对于大型多行字符串文字,我倾向于使用单独的文件并使用
getResourceAsStream()
(Class
类的方法)读取它 . 这样可以轻松找到该文件,因为您不必担心当前目录与安装代码的位置 . 它还使包装更容易,因为您实际上可以将文件存储在jar文件中 .假设你在一个名为Foo的类中 . 做这样的事情:
另一个烦恼是Java没有标准“将此Reader中的所有文本读入字符串”方法 . 虽然写起来很容易:
一个不错的选择 .
后期模型JAVA对常量字符串进行了优化,在后台使用了StringBuffer,因此您不希望使用它来混淆代码 .
它指向JAVA疏忽,它在双引号字符串的自动连接中不像ANSI C,它们之间只有空格,例如:
我希望有一个多行字符数组常量,嵌入的换行符得到尊重,所以我可以在没有任何混乱的情况下呈现块,例如:
要想得到这个,就需要击败JAVA之神 .
但是,最好的选择是使用String.format
一个小技巧 . 使用这个我在动态创建的HTML页面中注入javascritp
当使用很长的一系列时,只创建一个StringBuilder,除非在编译时确定String,在这种情况下不使用StringBuilder!
StringBuilder唯一有效的时候是使用多个语句来构造String .
注意:只创建一个StringBuilder .
尽可能简单明了 .
见Java Stringfier . 如果需要,将文本转换为StringBuilder java块转义 .
这是你永远不应该使用的东西,而不必考虑它是如何使用它取得巨大成功的:
例:
码:
Stephen Colebourne创建了一个proposal,用于在Java 7中添加多行字符串 .
此外,Groovy已经支持multi-line strings .
JEP 326: Raw String Literals将实现多行字符串,因此您可以编写如下内容:
它被计划为JDK 12中的功能预览 .
另一种选择可能是将长字符串存储在外部文件中并将该文件读入字符串 .
由于Java(尚未)本机支持多行字符串,现在是唯一的方法是使用上述技术之一来破解它 . 我使用上面提到的一些技巧构建了以下Python脚本:
将它放在名为javastringify.py的文件中,并将您的字符串放在mystring.txt文件中,并按如下方式运行:
然后,您可以复制输出并将其粘贴到编辑器中 .
根据需要修改它以处理任何特殊情况,但这符合我的需要 . 希望这可以帮助!