有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在Java中,参数总是按值传递。问题是,该值实际上是对位于堆内存中的真实对象的引用。 在您的情况下,只要调用getColumn方法,就必须创建一个新的csvReader实例

    public String getColumn(String filePath, String tagValue, int inputColumn, int outputColumn) throws Exception {
            
            FileReader fileReader = new FileReader(filePath);
            CSVReader csvReader= new CSVReader(fileReader);
            
            return fileReader(csvReader, tagValue, inputColumn, outputColumn);
        }
    

    filePath作为输入参数是每次都必须创建新csv实例的另一个原因。 没有人能保证第二次呼叫将使用相同的路径

    我在这里发现的另一个问题是这一部分:

    if(isNullOrEmpty(inputColumnValue) && isNullOrEmpty(ouputColumnValue))
                    if(inputColumnValue.equals(tagValue))
                        return ouputColumnValue;
    

    如果inputColumnValue为null或空,那么询问isinputColumnValue.equals(tagValue)就没有多大意义。特别是如果它为NULL,那么您将得到NullPointerException

    下面是一个如何从CSV(通知阅读器关闭部分)读取所有数据的示例

    public List<String[]> readAll(Reader reader) throws Exception {
        CSVReader csvReader = new CSVReader(reader);
        List<String[]> list = new ArrayList<>();
        list = csvReader.readAll();
        reader.close();
        csvReader.close();
        return list;
    }
    

    如果你的csv不是太大,也许你可以阅读csv内容一次,然后每次重复浏览列表,而不是一遍又一遍地打开csv