Java 使用useDelimiter()连接子字符串

Java 使用useDelimiter()连接子字符串,java,Java,我的方法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 s

我的方法
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
第一行有“金鹰”,两者都用标签隔开

这是不对的

显示所有列都由制表符(
\t
aka
\u0009
)分隔,但
黄金
由空格字符(
\u0020
)分隔

不要使用
扫描仪
读取文件。它非常慢,不是解析文件的合适工具。相反,使用
BufferedReader
readline()
方法,然后
split()
将行拆分为列

演示

输出

Bird金鹰艾迪
哺乳动物虎汤米
狮子座哺乳动物
鹦鹉波利
爬行动物眼镜蛇科林

如您所见,
Golden Eagle
文本未被拆分。

您只需将正确的列delimeter设置为
扫描仪的regexp即可。在以下示例中,我将
\t
设置为列delimeter,将
\n
设置为新行delimeter:

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;
    }
}
publicstaticlist readAnimals(InputStream-in){
try(Scanner scan=new Scanner(Foo.class.getResourceAsStream(“./anies.txt”)){
scan.useDelimiter(“[\\t |\\n]”);
列出动物=新建链接列表();
while(scan.hasNext()){
添加(新动物(scan.next(),scan.next(),scan.next());
}
归还动物;
}
}

小鸟和金鹰之间有一个制表符间距,金鹰和金鹰之间有一个制表符间距。请将分隔符用作选项卡空间。这将解决您的问题分隔符应该是一个tabI测试的代码,它工作良好,但是如果我别无选择,只能使用useDelimiter方法,作为项目的一部分,该怎么办?我该怎么做?@melisastewart
使用delimiter(“\t | \\R”)
,即在选项卡和上拆分令牌。但是,这是一个非常糟糕的想法,因为一行错误的行和不正确的列数会破坏文件其余部分的读取。读取行,然后分别解析每一行,将允许忽略一个错误行,同时继续解析其余行而不会出现问题。
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();
    }
}
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;
    }
}