6

我正在逐行读取文件,并希望根据特定的分隔符拆分每一行。我在 String 类和 StringUtils 类中找到了一些可用的选项。

所以我的问题是哪个是更好的选择,为什么?

4

3 回答 3

9

这取决于用例。

有什么不同 ?

String[] split(String regEx)

String[] results = StringUtils.split(String str,String separatorChars)

  1. 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 }

  2. 默认的String#split()使用正则表达式来拆分字符串。
    Apache 版本StringUtils#split()使用空格/字符/字符串字符/null [取决于 split() 方法签名]。
    由于复杂的正则表达式在广泛使用时非常昂贵,因此默认设置String.split()不是一个好主意。否则会更好。

  3. 当用于标记字符串时,如以下 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
于 2014-09-20T06:47:45.340 回答
1

好吧,这实际上取决于您想要实现的目标。阅读 and 方法的文档,split它们彼此完全不同。并根据您的要求StringStringUtils

...想根据特定的分隔符分割每一行。

看来你需要的是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.
于 2014-09-20T06:22:04.753 回答
1

值得注意的是 StringUtils.split 文档指出:. 相邻的分隔符被视为一个分隔符,例如 StringUtils.split("parm1,parm2,,parm4", ",") 给出 ["parm1", "parm2", "parm4"] 如果你想要 ["parm1", "parm2" ,"" ,"parm4"] 你需要 StringUtils.splitPreserveAllTokens

于 2016-09-09T11:36:12.683 回答