【发布时间】:2020-09-11 15:27:35
【问题描述】:
Java 是按值调用,但是当我传递 CSVReader 对象时,它作为按引用调用。
private CSVReader csvReader=null;
public String getColumn(String filePath, String tagValue, int inputColumn, int outputColumn) throws Exception {
if(csvReader == null){
FileReader fileReader = new FileReader(filePath);
csvReader= new CSVReader(fileReader);
}
return fileReader(csvReader, tagValue, inputColumn, outputColumn);
}
private String fileReader(CSVReader csvReader1, int tagValue, int inputIndex, int outputIndex) throws Exception {
String[] value = csvReader1.readNext();
while ((value = csvReader1.readNext()) != null) {
String inputColumnValue = value[inputIndex];
String ouputColumnValue = value[outputIndex];
if(isNullOrEmpty(inputColumnValue) && isNullOrEmpty(ouputColumnValue))
if(inputColumnValue.equals(tagValue))
return ouputColumnValue;
}
return null;
}
例如:
输入文件包含:
a1, b1, c1
a2, b2, b3
a3, b3, c3
比方说,我这样调用 fileReader:
getColumn(input file, "a3", 0, 2);
然后,它将返回 c3 作为输出。 如果我再这样称呼它:
getColumn(input file, "a3", 0, 2);
然后,它会返回异常。 因为 csvReader 作为按引用调用而不是按值调用传递。 首先,当 getColumn 调用 csvReader 指向第 0 行时。 但是在处理完我再次调用它之后,它将位于 N+1 行。 所以,它会返回异常。
任何重用 getColumn() 的解决方案。
【问题讨论】:
-
您的问题与 pass-by-value 或 pass-by-reference 无关。它是关于一个读者不能读两次的。这是一个单一的通过过程。如果你只想阅读一次并进行大量查询,则必须将内容加载到数据结构中并对其进行迭代。
标签: java csv file fileinputstream opencsv