设计思路
- 数据结构选择:使用
ConcurrentHashMap
作为线程安全的集合来存储解析后的键值对。
- 多线程处理:使用线程池来管理线程,避免频繁创建和销毁线程带来的开销。
- 任务划分:将大文件按行分割,每个线程负责处理一部分行数据。
- 异常处理:在解析过程中捕获异常,并进行适当的日志记录,确保程序的健壮性。
关键代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.StringTokenizer;
public class LargeFileParser {
private static final int THREAD_POOL_SIZE = 10;
private final String filePath;
private final ConcurrentHashMap<String, String> resultMap = new ConcurrentHashMap<>();
public LargeFileParser(String filePath) {
this.filePath = filePath;
}
public void parseFile() {
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
int lineNumber = 0;
while ((line = reader.readLine()) != null) {
int currentLine = lineNumber++;
executorService.submit(() -> {
try {
parseLine(line, currentLine);
} catch (Exception e) {
System.err.println("Error parsing line " + currentLine + ": " + e.getMessage());
}
});
}
} catch (IOException e) {
System.err.println("Error reading file: " + e.getMessage());
} finally {
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
System.err.println("Pool did not terminate");
}
}
} catch (InterruptedException ie) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
private void parseLine(String line, int lineNumber) {
StringTokenizer tokenizer = new StringTokenizer(line, ":");
if (tokenizer.countTokens() != 2) {
throw new IllegalArgumentException("Invalid line format at line " + lineNumber + ": " + line);
}
String key = tokenizer.nextToken();
String value = tokenizer.nextToken();
resultMap.put(key, value);
}
public ConcurrentHashMap<String, String> getResultMap() {
return resultMap;
}
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Usage: java LargeFileParser <filePath>");
return;
}
LargeFileParser parser = new LargeFileParser(args[0]);
parser.parseFile();
ConcurrentHashMap<String, String> result = parser.getResultMap();
System.out.println("Parsed result size: " + result.size());
}
}