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