【问题标题】:Please help me understand this line of code请帮我理解这行代码
【发布时间】:2026-02-23 04:55:02
【问题描述】:
CSVParser csvParser = null;
String csvFilename = "C:\\Users\\ITEM.txt20141022";


csvParser = new CSVParser(new BufferedReader(new FileReader(csvFilename)), CSVFormat.newFormat('|'));

据我了解的算法:

  1. FileReader 对象被传递给 BufferedReader 构造函数。
  2. BufferedReader 对象被传递给 CSVParser 构造函数。这将是传递给 csvParser 的两个参数之一吗?
  3. csvParser 的第二个参数是 CSVFormat.newFormat('|')

是否会将此行视为传递给 csvParser 对象的两个参数?然后在csvParser构造函数中使用这两个参数?我查看了 javadocs,但无法理解所有这些部分如何组合在一起来实例化 CSVParser。一开始你怎么知道这是可能的?我已经学习了几个星期的初学者 Java 课程,但我从未见过这样的事情。有人可以向我解释一下这条线是如何工作的,就好像你在和一个 5 岁的孩子说话一样。

【问题讨论】:

  • 您会查看 CSVParser 的 javadoc 并看到它有一个构造函数接受 BufferedReader 或 Reader 作为第一个参数,并且可能是 CSVFormat(假设这是 newFormat() 返回的内容)作为第二个论点。 CSVParser 有几十个不同的类,所以我们不知道您使用的是哪一个。
  • 在我看来你已经明白了。这是哪个CSVParser,来自Apache Commons 的this constructor
  • 是的,我正在使用 Apache commons。我听说如果可能的话,这是推荐的。它是否正确?如果可以,请使用 apache 公共类。我得到的解释是它是经过验证的。

标签: java object csv io


【解决方案1】:

据我所知,你说得对。

这个程序员调用构造函数来代替声明正确类型的对象,实例化对象以放入对象变量,然后使用变量。也可以写成:

CSVFormat format = CSVFormat.newFormat('|');
FileReader reader = new FileREader(csvFilename);
BufferedReader bReader = new BufferedReader(reader);
CSVParser parser = new CSVParser(bReader, format);

我假设第一个方法调用返回的类型。

希望这更清楚。我本来就是这样写的……

【讨论】:

  • 这太容易理解了。哇谢谢你。现在我需要弄清楚他是如何缩短它的。再次感谢。
  • @*1 对于该语言的新手来说更容易。但是任何只有一点 Java 经验的开发人员都能很好地理解您的原始代码。有经验的 Java 开发人员可能会发现“简化”的代码过于冗长并引入了无用的变量。
  • 一些有经验的 Java 开发人员可能会这么认为。我已经用 Java 编程了 15 年,但我仍然发现原始版本更易于理解、调试和确保正确。引入的变量的唯一区别是显式变量是可见的。它们不占用额外的内存空间,编译时间可以忽略不计,等等——第一种方式没有技术原因,第二种方式有几个软件工程原因。例如:它让作者有机会命名参数,以便更好地描述事物。
  • 好吧,看完这个我有一个问题。没有额外的变量意味着您不必为每个变量声明一个类型?为什么这可能?就像在unix中管道一样吗?就像使用管道而不是临时文件一样。
  • 因为Java是强类型的,构造函数和方法各自返回一个特定类型的对象(或者方法可以返回null,在这种情况下没用)。构造或返回的对象也匹配其他类型——任何超类和任何实现的接口。当其中一个的结果用作参数时,编译器会花费一些时间来确定任何匹配的类型是否与正在调用的构造函数的任何参数匹配(或帮助确定要调用的构造函数)。
【解决方案2】:

CSVParser 构造函数有两个参数,如下:

CSVParser(Reader reader, CSVFormat format)

现在仔细看代码,应该很容易理解,注意括号

【讨论】: