Apache commons csv解析尝试读取集合大小后面的下一条记录



我正在使用java库Apache commons csv来解析csv。问题是我得到IOException,我不明白为什么Iterable CSVRecord正在尝试计算下一行并以异常结束。它的怪异行为。

while (!parsedCorrectly && !failedOnException) {
try (final Reader reader = new InputStreamReader(new FileInputStream(file.getPath()), "UTF-8")){
parser = new CSVParser(reader, format);
} catch (IOException | IllegalArgumentException e) {
LOG.debug("Headers contain duplicate name "+ e.getMessage());
failedOnException = true;
break;
}
if (parser != null) {
try {
for (final CSVRecord record : parser) {
if (record.size() == 1 && !parsedCorrectly) {
format = setAlternativeParsingFormat(formatNumber);
formatNumber++;
break;
} else {
parsedCorrectly = true;
}
IssueInputParameters issueInputParameters = issueService.newIssueInputParameters();
try {
setOOTBFieldsToIssueInputParameters(issueInputParameters, record);
} catch (InvalidInputException e) {
addValidationErrorMessage(e.getMessage(), issueNumber);
valid = false;
}
Map<String, String> recordMap = record.toMap();
for (Map.Entry<String, String> entry : recordMap.entrySet()) {
CustomField customField = customFieldManager.getCustomFieldObjectsByName(
entry.getKey()).stream().findFirst().orElse(null);
if (customField != null && entry.getValue() != null) {
addStringValueToIssueParameters(customField, issueInputParameters, entry.getValue(), issueNumber);
if (issueInputParameters.getCustomFieldValue(customField.getId()) == null) {
issueInputParameters.addCustomFieldValue(customField.getId(), entry.getValue());
}
}
}
createIssue(issueInputParameters, issueNumber);
issueNumber++;
valid = true;
}
} catch (Exception e) {
failedOnException = true;
LOG.debug("There was problem to import file");
} finally {
if (parser != null) {
parser.close();
}
}
}
}

java.lang.IllegalStateException: IOException reading next record: java.io.IOException: Stream closed

正如您所看到的,在for循环中,我在尝试读取下一条显然不存在的记录时遇到异常。

当底层Reader已经在第一个try-with-resources块内关闭时,您正试图迭代初始化的CSVParser

try (final Reader reader = new InputStreamReader(new FileInputStream(file.getPath()), "UTF-8")) { // the reader is closed when this code block exits
parser = new CSVParser(reader, format);
}
//...
for (final CSVRecord record : parser) { // here you are accessing a closed resource
//...

您应该在解析代码的过程中始终保持Reader的打开状态,以便在读取文件中的项目时保持输入流的打开状态。

下面是代码片段的一个稍微修改过的版本:注意:删除了无用的if检查,并且两个Closeable资源都已重构为相同的try

while (!parsedCorrectly && !failedOnException) {
try (final Reader reader = new InputStreamReader(new FileInputStream(file.getPath()), "UTF-8");
CSVParser parser = new CSVParser(reader, format)) {
for (final CSVRecord record : parser) {
if (record.size() == 1 && !parsedCorrectly) {
format = setAlternativeParsingFormat(formatNumber);
formatNumber++;
break;
} else {
parsedCorrectly = true;
}
IssueInputParameters issueInputParameters = issueService.newIssueInputParameters();
try {
setOOTBFieldsToIssueInputParameters(issueInputParameters, record);
} catch (InvalidInputException e) {
addValidationErrorMessage(e.getMessage(), issueNumber);
valid = false;
}
Map<String, String> recordMap = record.toMap();
for (Map.Entry<String, String> entry : recordMap.entrySet()) {
CustomField customField = customFieldManager.getCustomFieldObjectsByName(
entry.getKey()).stream().findFirst().orElse(null);
if (customField != null && entry.getValue() != null) {
addStringValueToIssueParameters(customField, issueInputParameters, entry.getValue(), issueNumber);
if (issueInputParameters.getCustomFieldValue(customField.getId()) == null) {
issueInputParameters.addCustomFieldValue(customField.getId(), entry.getValue());
}
}
}
createIssue(issueInputParameters, issueNumber);
issueNumber++;
valid = true;
}
} catch (IOException | IllegalArgumentException e) {
LOG.debug("Headers contain duplicate name "+ e.getMessage());
failedOnException = true;
break;
}
}

最新更新