csv在java中如何将CSVReader对象作为按值调用而不是按引用调用传递?
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()的解决方案
# 1 楼答案
在Java中,参数总是按值传递。问题是,该值实际上是对位于堆内存中的真实对象的引用。 在您的情况下,只要调用
getColumn
方法,就必须创建一个新的csvReader实例将
filePath
作为输入参数是每次都必须创建新csv实例的另一个原因。 没有人能保证第二次呼叫将使用相同的路径我在这里发现的另一个问题是这一部分:
如果
inputColumnValue
为null或空,那么询问isinputColumnValue.equals(tagValue)
就没有多大意义。特别是如果它为NULL,那么您将得到NullPointerException下面是一个如何从CSV(通知阅读器关闭部分)读取所有数据的示例
如果你的csv不是太大,也许你可以阅读csv内容一次,然后每次重复浏览列表,而不是一遍又一遍地打开csv