7

我几乎没有使用分隔符的经验,我需要读取一个文本文件,该文件存储多个对象,这些对象的数据存储在单行中,由逗号 (",") 分隔。然后使用单独的字符串创建一个新对象,该对象被添加到数组列表中。

Amadeus,Drama,160 Mins.,1984,14.83
As Good As It Gets,Drama,139 Mins.,1998,11.3
Batman,Action,126 Mins.,1989,10.15
Billy Elliot,Drama,111 Mins.,2001,10.23
Blade Runner,Science Fiction,117 Mins.,1982,11.98
Shadowlands,Drama,133 Mins.,1993,9.89
Shrek,Animation,93 Mins,2001,15.99
Snatch,Action,103 Mins,2001,20.67
The Lord of the Rings,Fantasy,178 Mins,2001,25.87

我正在使用 Scanner 读取文件,但是我得到一个 no line found 错误并且整个文件被存储到一个字符串中:

Scanner read = new Scanner (new File("datafile.txt"));
read.useDelimiter(",");
String title, category, runningTime, year, price;

while (read.hasNext())
{
   title = read.nextLine();
   category = read.nextLine();
   runningTime = read.nextLine();
   year = read.nextLine();
   price = read.nextLine();
   System.out.println(title + " " + category + " " + runningTime + " " +
                      year + " " + price + "\n"); // just for debugging
}
read.close();
4

6 回答 6

12

使用 read.next() 而不是 read.nextLine()

   title = read.next();
   category = read.next();
   runningTime = read.next();
   year = read.next();
   price = read.next();
于 2013-01-09T17:36:49.500 回答
4

我想你想调用.next()which 返回一个 String 而不是.nextLine(). 您的.nextLine()呼叫正在越过当前线路。

Scanner read = new Scanner (new File("datafile.txt"));
   read.useDelimiter(",");
   String title, category, runningTime, year, price;

   while(read.hasNext())
   {
       title = read.next();
       category = read.next();
       runningTime = read.next();
       year = read.next();
       price = read.next();
     System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
   }
   read.close();
于 2013-01-09T17:39:39.713 回答
2

你应该next(); 在你使用的地方使用nextLine();

看看教程:http ://docs.oracle.com/javase/tutorial/essential/io/scanning.html

注意这些行:

try {
   s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

   while (s.hasNext()) {
   System.out.println(s.next());
}
于 2013-01-09T17:35:21.253 回答
2

上面所有的答案都是正确的,实际上是一样的。然而,重要的一点是每个人都应该记住,Scanner缓冲区大小只有 1024。这意味着如果分隔文本的长度更长,解析将停止。

因此,对给定的解决方案进行一点改进,使用BufferedReader而不是直接将文件传递给Scanner. 例子:

    BufferedReader in = new BufferedReader(new FileReader("datafile.txt"), 16*1024);
    Scanner read = new Scanner(in);
    read.useDelimiter(",");
    String title, category, runningTime, year, price;

    while(read.hasNext())
    {
        title = read.next();
        category = read.next();
        runningTime = read.next();
        year = read.next();
        price = read.next();
        System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
    }
    read.close();
于 2018-10-30T07:51:47.410 回答
1

您还可以使用 String.split() 函数将字符串转换为字符串数组,然后遍历每个字符串以获得您的值。

如何将逗号分隔的字符串转换为 ArrayList?有关更多详细信息,请参阅此内容。

于 2013-01-09T17:33:53.293 回答
0

一个问题是:

while(read.hasNext())
   {
       title = read.nextLine();
       category = read.nextLine();
       runningTime = read.nextLine();

hasNext()

如果此扫描器在其输入中有另一个标记,则返回 true。不是整行。您需要使用hasNextLine()

您正在执行 nextLine() 三次。我认为您需要做的是,阅读该行并拆分该行。

于 2013-01-09T17:30:56.580 回答