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;
}
}