首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java阅读文件

问Java阅读文件
EN

Stack Overflow用户
提问于 2017-09-13 06:46:36
回答 2查看 72关注 0票数 1

我正在读取csv file.and,因为我已经创建了2种方法,1)getHeaders和2)getContent,因此假设1行作为头文件,我在头文件中取1行,并存储在一个变量中,因此当我再次读取该文件时,我无法获得预期的输出。

代码语言:javascript
复制
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:

代码语言:javascript
复制
name,add,sal
john,SF,25k
Roy,Chicago,30k
jason,SF,35k
joy,Sf,50K

输出:

代码语言:javascript
复制
name,add,sal
john,SF,25k
jason,SF,35k
null

预期产出:

代码语言:javascript
复制
name,add,sal
john,SF,25k
Roy,Chicago,30k
jason,SF,35k
joy,Sf,50K
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-23 20:11:25

解释

这是因为您使用readLine检查是否有需要读取的内容,然后在循环中再次使用readLine。

因此,您实际上读取了一行,拒绝它(在条件内),然后再次读取一行。因此,每次迭代时,您都要读取的两行行,但是只打印一条,并且您也只需要检查这些两条行中的null和1。这就是为什么在最后一次迭代中看到null的打印,因为没有剩下的行了。

考虑到你的例子:

代码语言:javascript
复制
name,add,sal     // $1
john,SF,25k      // $2
Roy,Chicago,30k  // $3
jason,SF,35k     // $4
joy,Sf,50K       // $5

你的密码是:

代码语言:javascript
复制
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):

代码语言:javascript
复制
name,add,sal   // $1
john,SF,25k    // $2
jason,SF,35k   // $4
null           // ($6)

这正是你所得到的。

解决方案

你需要修正你的逻辑。如果你想检查是否有什么东西可读,不要读,只要检查一下。或者阅读它,将它存储在一个变量中,然后检查这个变量。

代码语言:javascript
复制
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,您可以优雅地打印每一行与平台无关的,如下所示:

代码语言:javascript
复制
Path fileToRead = Paths.get(System.getProperty("user.home"), "Desktop", "Abc.csv");
Files.lines(fileToRead).forEach(System.out::println);

就这样。Path取代了旧的File类。Paths和Files提供实用方法。这是他们的文件:

票数 1
EN

Stack Overflow用户

发布于 2017-10-23 14:34:30

您可以使用hasNext()检查输入是否有下一行,然后使用next()打印每一行。

注意:您可能应该在这里使用一些try-catch来检查文件是否存在等等。

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46190628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档