我的方法readDataFromFile()
可以读取以下文本文件:
Bird Golden Eagle Eddie
Mammal Tiger Tommy
Mammal Lion Leo
Bird Parrot Polly
Reptile Cobra Colin
第一列是动物的“类型”,第二列是“物种”,第三列是“名称”。
当前输出:
Bird Golden Eagle < (Golden and Eagle count as different substrings).
Mammal Tiger Tommy
Mammal Lion Leo
Bird Parrot Polly
Reptile Cobra Colin
useDelimiter
方法将“金鹰”计为一个物种?当前代码:
while(scanner.hasNextLine())
{
String type = scanner.next();
String species = scanner.next();
String name = scanner.next();
System.out.println(type + " " + species + " " + name);
scanner.nextLine();
addAnimal( new Animal(species, name, this) );
}
答案 0 :(得分:2)
第一行的“金鹰”都用制表符分隔
那是不正确的。
source of your question显示各列均由制表符(<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="bgimages">A</div>
<div class="bgimages">B</div>
<div class="bgimages">C</div>
<div class="bgimages">D</div>
或\t
隔开,但\u0009
和Golden
则由空格字符(Eagle
)。
请勿使用\u0020
读取文件。它非常慢,不是解析文件的适当工具。而是使用Scanner
和BufferedReader
方法,然后将行readline()
分成列。
演示
split()
输出
try (BufferedReader in = Files.newBufferedReader(Paths.get("animals.txt"))) {
for (String line; (line = in.readLine()) != null; ) {
String[] values = line.split("\t");
for (String value : values)
System.out.printf("%-15s", value);
System.out.println();
}
}
如您所见,Bird Golden Eagle Eddie
Mammal Tiger Tommy
Mammal Lion Leo
Bird Parrot Polly
Reptile Cobra Colin
文本未拆分。
答案 1 :(得分:0)
您所需要的只是将正确的列分度设置为Scanner
的 regexp 。在下面的示例中,我将\t
设置为列分隔符,将\n
设置为新行分隔符:
public static List<Animal> readAnimals(InputStream in) {
try (Scanner scan = new Scanner(Foo.class.getResourceAsStream("./animals.txt"))) {
scan.useDelimiter("[\\t|\\n]");
List<Animal> animals = new LinkedList<>();
while (scan.hasNext()) {
animals.add(new Animal(scan.next(), scan.next(), scan.next()));
}
return animals;
}
}