本文目录导读:

- 使用 String.split() 方法(最常用)
- 使用 StringTokenizer 类(遗留类,但性能较好)
- 使用 Pattern 和 Matcher 类(正则表达式拆分)
- 使用第三方库 Apache Commons Lang
- 大数据量高性能拆分(使用流处理)
- 实际案例:CSV文件解析
- 性能对比与选择建议
在Java中实现数据拆分主要通过字符串的split()方法、StringTokenizer类、正则表达式以及第三方库(如Apache Commons Lang)来实现,以下是几种常见的数据拆分方案及代码案例:
使用 String.split() 方法(最常用)
public class SplitExample {
public static void main(String[] args) {
// 基础拆分:按逗号拆分
String data1 = "apple,banana,orange,grape";
String[] fruits = data1.split(",");
System.out.println("按逗号拆分:");
for (String fruit : fruits) {
System.out.println(fruit);
}
// 按空格拆分
String data2 = "Java Python C++ JavaScript";
String[] languages = data2.split(" ");
System.out.println("\n按空格拆分:");
for (String lang : languages) {
System.out.println(lang);
}
// 按多个分隔符拆分(使用正则表达式)
String data3 = "a|b,c.d e;f";
String[] items = data3.split("[|,.; ]");
System.out.println("\n按多个分隔符拆分:");
for (String item : items) {
System.out.println(item);
}
// 限制拆分数量
String data4 = "one,two,three,four";
String[] limited = data4.split(",", 3);
System.out.println("\n限制拆分数量为3:");
System.out.println("元素0: " + limited[0]); // one
System.out.println("元素1: " + limited[1]); // two
System.out.println("元素2: " + limited[2]); // three,four
}
}
使用 StringTokenizer 类(遗留类,但性能较好)
import java.util.StringTokenizer;
public class StringTokenizerExample {
public static void main(String[] args) {
// 基本使用
String data = "123-456-789-012";
StringTokenizer tokenizer = new StringTokenizer(data, "-");
System.out.println("使用StringTokenizer拆分:");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
// 多分隔符
String complexData = "a,b;c|d:e";
StringTokenizer multiToken = new StringTokenizer(complexData, ",;|:");
System.out.println("\n多分隔符拆分:");
while (multiToken.hasMoreTokens()) {
System.out.println(multiToken.nextToken());
}
}
}
使用 Pattern 和 Matcher 类(正则表达式拆分)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternSplitExample {
public static void main(String[] args) {
// 复杂正则拆分
String text = "User:123,Email:test@test.com,Phone:1234567890";
// 提取键值对
Pattern pattern = Pattern.compile("(\\w+):(\\w+[.,@]?\\w*)");
Matcher matcher = pattern.matcher(text);
System.out.println("使用正则提取键值对:");
while (matcher.find()) {
String key = matcher.group(1);
String value = matcher.group(2);
System.out.println(key + " = " + value);
}
// 使用Pattern.split()方法
String data = "apple123banana456orange";
Pattern numberPattern = Pattern.compile("\\d+");
String[] parts = numberPattern.split(data);
System.out.println("\n按数字拆分:");
for (String part : parts) {
System.out.println(part);
}
}
}
使用第三方库 Apache Commons Lang
// 需要引入依赖:org.apache.commons:commons-lang3
import org.apache.commons.lang3.StringUtils;
public class CommonsLangExample {
public static void main(String[] args) {
// 使用 StringUtils.split()
String data = " hello world java ";
String[] words = StringUtils.split(data);
System.out.println("使用StringUtils.split()(忽略空白):");
for (String word : words) {
System.out.println("[" + word + "]");
}
// 按指定字符拆分
String csvData = "a||b||c||d";
String[] parts = StringUtils.split(csvData, "||");
System.out.println("\n按||拆分:");
for (String part : parts) {
System.out.println(part);
}
}
}
大数据量高性能拆分(使用流处理)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamSplitExample {
// 文件数据拆分
public static List<String[]> splitFileData(String filePath, String delimiter) {
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
return reader.lines()
.map(line -> line.split(delimiter))
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
// 流式拆分字符串
public static Stream<String> splitToStream(String data, String delimiter) {
return Stream.of(data.split(delimiter));
}
public static void main(String[] args) {
String data = "a,b,c,d,e,f,g,h,i,j";
System.out.println("使用流拆分并处理:");
List<String> result = splitToStream(data, ",")
.filter(s -> !s.equals("c")) // 过滤掉c
.map(String::toUpperCase) // 转大写
.collect(Collectors.toList());
System.out.println(result); // [A, B, D, E, F, G, H, I, J]
}
}
实际案例:CSV文件解析
public class CSVParser {
// 解析标准CSV行(处理引号内的逗号)
public static String[] parseCSVLine(String line) {
List<String> fields = new ArrayList<>();
StringBuilder currentField = new StringBuilder();
boolean inQuotes = false;
for (char c : line.toCharArray()) {
if (c == '"') {
inQuotes = !inQuotes;
} else if (c == ',' && !inQuotes) {
fields.add(currentField.toString().trim());
currentField = new StringBuilder();
} else {
currentField.append(c);
}
}
fields.add(currentField.toString().trim());
return fields.toArray(new String[0]);
}
public static void main(String[] args) {
String csvLine = "\"Smith, John\",35,\"123 Main St\",\"Engineer\"";
String[] parts = parseCSVLine(csvLine);
System.out.println("CSV行解析结果:");
for (int i = 0; i < parts.length; i++) {
System.out.println("字段" + i + ": " + parts[i]);
}
}
}
性能对比与选择建议
| 方法 | 适用场景 | 性能 | 特点 |
|---|---|---|---|
split() |
简单拆分,日常使用 | 中等 | 返回数组,使用方便 |
StringTokenizer |
高性能拆分 | 高 | 遗留类,不支持正则 |
Pattern/Matcher |
复杂拆分 | 中等 | 灵活的正则支持 |
| Commons Lang | 复杂场景 | 高 | 功能全面,稳定性好 |
| 流式处理 | 大数据量 | 依赖场景 | 链式操作,函数式风格 |
选择建议:
- 简单拆分:使用
String.split() - 性能要求高:使用
StringTokenizer或 Commons Lang - 需要正则处理:使用
Pattern/Matcher或String.split() - 处理大量数据:考虑使用流式处理和文件流
根据实际需求选择最合适的拆分方式即可。