我正在读取csv file.and,因为我已经创建了2种方法,1)getHeaders和2)getContent,因此假设1行作为头文件,我在头文件中取1行,并存储在一个变量中,因此当我再次读取该文件时,我无法获得预期的输出。
public static String getHeaderLine(File file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
String headerLine = reader.readLine();
return headerLine;
}
public void convertCSVtoJSON() throws IOException {
File f = new File("C:\\user\\Desktop\\Abc.csv");
String headerLine = CSVtoJSON.getHeaderLine(f);
System.out.println(getHeaderLine(f));
BufferedReader in = new BufferedReader(new FileReader(f));
while (in.readLine() != null) {
System.out.println(in.readLine());
}
}Abc.csv:
name,add,sal
john,SF,25k
Roy,Chicago,30k
jason,SF,35k
joy,Sf,50K输出:
name,add,sal
john,SF,25k
jason,SF,35k
null预期产出:
name,add,sal
john,SF,25k
Roy,Chicago,30k
jason,SF,35k
joy,Sf,50K发布于 2017-10-23 20:11:25
解释
这是因为您使用readLine检查是否有需要读取的内容,然后在循环中再次使用readLine。
因此,您实际上读取了一行,拒绝它(在条件内),然后再次读取一行。因此,每次迭代时,您都要读取的两行行,但是只打印一条,并且您也只需要检查这些两条行中的null和1。这就是为什么在最后一次迭代中看到null的打印,因为没有剩下的行了。
考虑到你的例子:
name,add,sal // $1
john,SF,25k // $2
Roy,Chicago,30k // $3
jason,SF,35k // $4
joy,Sf,50K // $5你的密码是:
System.out.println(getHeaderLine(f)); // #1
while (in.readLine() != null) { // #2
System.out.println(in.readLine()); // #3
}行#1读取$1的第一线,打印。
然后创建一个新的BufferedReader,它的指针再次放置在文件的开头,所以头行。执行行#2,再次读取头行$1并检查其是否为null。它不是null,代码开始了第一个循环迭代。
行#3被执行,读取和打印第二线 $2。循环再次检查行#2中的条件,它读取下一行$3并检查它是否为null。
它不是,行#3被执行,读取和打印行 $4。在行#2中再次检查条件,因此它读取行$5并检查其是否为null。它再次不是null,因此它还在继续。
同样,行#3被执行,它读取和打印一行 ($6)。然而,由于没有剩下的行可读,它读取和打印null。再次检查条件,尝试读取一行($7),但没有,循环终止。
总之,我们已经打印了行$1 (由于#1)和$2,$4,null (由于#3):
name,add,sal // $1
john,SF,25k // $2
jason,SF,35k // $4
null // ($6)这正是你所得到的。
解决方案
你需要修正你的逻辑。如果你想检查是否有什么东西可读,不要读,只要检查一下。或者阅读它,将它存储在一个变量中,然后检查这个变量。
while (true) {
// Read a line
String line = in.readLine();
if (line == null) {
// Abort, nothing to read anymore
break;
}
// Print what we have read
System.out.println(line);
}现代解决方案: NIO
但是,我建议您不再使用BufferedReader和这个东西来读取文件。Java已经更新了它的I/Java,我们现在使用NIO,它围绕着类Path、Paths和Files。使用NIO,您可以优雅地打印每一行与平台无关的,如下所示:
Path fileToRead = Paths.get(System.getProperty("user.home"), "Desktop", "Abc.csv");
Files.lines(fileToRead).forEach(System.out::println);就这样。Path取代了旧的File类。Paths和Files提供实用方法。这是他们的文件:
发布于 2017-10-23 14:34:30
您可以使用hasNext()检查输入是否有下一行,然后使用next()打印每一行。
注意:您可能应该在这里使用一些try-catch来检查文件是否存在等等。
Scanner scanner = new Scanner(new File("C:\\user\\Desktop\\Abc.csv"));
String headerLine = scanner.next();
//this now has the first line in 'headerLine'
System.out.print(headerLine);
System.out.print(" ");
while (scanner.hasNext()) {
System.out.print(scanner.next() + " ");
}
scanner.close();https://stackoverflow.com/questions/46190628
复制相似问题