团队,我必须逐行解析文件,在单行中我已经拆分了“,”。 First String是Name,Second是count。最后我必须显示Key和Count 例如
Peter,2
Smith,3
Peter,3
Smith,5
我应该表现为彼得5和史密斯8。
所以我很困惑在BufferedReader和Scanner之间做出选择。经过link。我想出了这两种方法。我想得到你的担忧。
方法1:使用缓冲的阅读器。
private HashMap<String, MutableLong> readFile(File file) throws IOException {
final HashMap<String, MutableLong> keyHolder = new HashMap<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "UTF-8"))) {
for (String line; (line = br.readLine()) != null;) {
// processing the line.
final String[] keyContents = line
.split(KeyCountExam.COMMA_DELIMETER);
if (keyContents.length == 2) {
final String keyName = keyContents[0];
final long count = Long.parseLong(keyContents[1]);
final MutableLong keyCount = keyHolder.get(keyName);
if (keyCount != null) {
keyCount.add(count);
keyHolder.put(keyName, keyCount);
} else {
keyHolder.put(keyName, new MutableLong(count));
}
}
}
}
return keyHolder;
}
private static final String COMMA_DELIMETER = ",";
private static volatile Pattern commaPattern = Pattern
.compile(COMMA_DELIMETER);
我使用过MutableLong(因为我不想每次创建BigInteger。再次,它可能是一个非常大的文件,我无法控制密钥的最大可能性
另一种方法:
使用扫描仪并使用两个分隔符
private static final String LINE_SEPARATOR_PATTERN = "\r\n|[\n\r\u2028\u2029\u0085]";
private static final String LINE_PATTERN = ".*(" + LINE_SEPARATOR_PATTERN
+ ")|.+$";
private static volatile Pattern linePattern = Pattern.compile(LINE_PATTERN);
我的问题是。我已经浏览了扫描仪中的hasNext,对我来说切换模式没有坏处。而且我相信Java 7,Scanner确实有限的缓冲区就足够了这种文件。
在方法1中做任何一个更好的方法2,还是除此之外我们还有其他选择。我只是为了测试目的而做了。显然,方法1中的相同代码将取代此处。在Approach1中使用split将创建多个String实例。这可以通过扫描char序列来避免(我是对的)。
private HashMap<String, BigInteger> readFileScanner(File file)
throws IOException {
final HashMap<String, BigInteger> keyHolder = new HashMap<>();
try (Scanner br = new Scanner(file, "UTF-8")) {
while (br.hasNext()) {
br.useDelimiter(commaPattern);
System.out.println(br.next());
System.out.println(br.next());
br.useDelimiter(linePattern);
}
}
return keyHolder;
}