在读取文件时使用分隔符

时间:2013-01-09 17:29:31

标签: java delimiter

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

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读取文件,但是我发现没有找到行错误,整个文件存储在一个字符串中:

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();

6 个答案:

答案 0 :(得分:12)

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

   title = read.next();
   category = read.next();
   runningTime = read.next();
   year = read.next();
   price = read.next();

答案 1 :(得分:3)

我想你想调用.next(),它返回一个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();

答案 2 :(得分: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());
}

答案 3 :(得分:1)

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

How to convert comma-separated String to ArrayList?有关详细信息,请参阅此内容。

答案 4 :(得分:0)

一个问题是:

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

hasNext()

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

你正在做nextLine()三次。我认为你需要做的是,读取线和分割线。

答案 5 :(得分:0)

以上所有答案都是正确的,实际上是相同的。但是,重要的一点是每个人都应该记住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();