问题在于在
BufferedReader同一对象上创建两个
Reader。当您从中读取数据时
BufferedReader,它可能会读取比返回的数据更多的内容到其缓冲区中(因此而得名)。换句话说,即使您仅从中读取了一行
BufferedReader,
InputStreamReader可能仍从中读取了很多数据-
因此,如果您再次读取 该行
InputStreamReader,则会丢失该数据。该数据有效地被吸 从 该
InputStreamReader
到 了
BufferedReader,因此让出来给客户端代码的唯一方法是从阅读它
BufferedReader。
换句话说,您声称:
不。fetchHeaders()仅读取包含标题的CSV的第一行。
是不正确的。它仅 使用 那么多的数据,但会 从中读取 更多数据
InputStreamReader。
正如Ilya所说,您只能
BufferedReader在原始之上创建一个
InputStreamReader,并将其传递给这两种方法。
fetchHeaders然后可以使用它
BufferedReader来读取一行,然后
processContentRows可以使用来完成所需的 *** 作
BufferedReader-这只是
Reader它需要知道的内容。
因此,稍微修改一下Ilya的示例:
public static void main(String[] args) { FileInputStream fis = new FileInputStream("FileName.CSV"); BufferedInputStream bis = new BufferedInputStream(fis); InputStreamReader isr = new InputStreamReader(bis); BufferedReader br = new BufferedReader(isr); processCSV(br);}private static void processCSV(BufferedReader reader) { fetchHeaders(reader); processContentRows(reader);}private static void fetchHeaders(BufferedReader reader) { // Use reader.readLine() here directly... do *not* create // another BufferedReader on top.}private static void processContentRows(Reader reader) { // This could be declared to take a BufferedReader if you like, // but it doesn't matter much.}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)