我正在逐行读取文件,并希望根据特定的分隔符拆分每一行。我在 String 类和 StringUtils 类中找到了一些可用的选项。
所以我的问题是哪个是更好的选择,为什么?
我正在逐行读取文件,并希望根据特定的分隔符拆分每一行。我在 String 类和 StringUtils 类中找到了一些可用的选项。
所以我的问题是哪个是更好的选择,为什么?
这取决于用例。
有什么不同 ?
String[] split(String regEx)
String[] results = StringUtils.split(String str,String separatorChars)
Apache utils split() 是空安全的。StringUtils.split(null)
将返回null
。JDK 默认不是 null 安全的:
try{
String testString = null;
String[] result = testString.split("-");
System.out.println(result.length);
} catch(Exception e) {
System.out.println(e); // results NPE
}
默认的String#split()使用正则表达式来拆分字符串。
Apache 版本StringUtils#split()使用空格/字符/字符串字符/null [取决于 split() 方法签名]。
由于复杂的正则表达式在广泛使用时非常昂贵,因此默认设置String.split()
不是一个好主意。否则会更好。
当用于标记字符串时,如以下 string.split() 返回一个额外的空字符串。而 Apache 版本给出了正确的结果
String testString = "$Hello$Dear$";
String[] result = testString.split("\\$");
System.out.println("Length is "+ result.length); //3
int i=1;
for(String str : result) {
System.out.println("Str"+(i++)+" "+str);
}
输出
Length is 3 Str1 Str2 Hello Str3 Dear
String[] result = StringUtils.split(testString,"$");
System.out.println("Length is "+ result.length); // 2
int i=1;
for(String str : result) {
System.out.println("Str"+(i++)+" "+str);
}
输出
Length is 2 Str1 Hello Str2 Dear
好吧,这实际上取决于您想要实现的目标。阅读 and 方法的文档,split
它们彼此完全不同。并根据您的要求String
StringUtils
...想根据特定的分隔符分割每一行。
看来你需要的是split
方法String
public String[] split(String regex)
- 围绕给定正则表达式的匹配拆分此字符串。(源)前任:
String str = "abc def";
str.split(" ");
返回:
["abc", "def"]
因为其中的一个StringUtils
是:
public static String[] split(String str)
- 将提供的文本拆分为一个数组,使用空格作为分隔符。(源)前任:
StringUtils.split("abc def")
返回:
["abc", "def"]
虽然这是一个重载方法,所以您可以使用带有另一个参数作为分隔符的方法
public static String[] split(String str, char separatorChar)
- 将提供的文本拆分为一个数组,指定分隔符。这是使用StringTokenizer
.值得注意的是 StringUtils.split 文档指出:. 相邻的分隔符被视为一个分隔符,例如 StringUtils.split("parm1,parm2,,parm4", ",") 给出 ["parm1", "parm2", "parm4"] 如果你想要 ["parm1", "parm2" ,"" ,"parm4"] 你需要 StringUtils.splitPreserveAllTokens