尝试运行此程序(编辑和删除csv文件中的内容)时出现错误。 错误:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at project.AnimalManager.loadFromFile(AnimalManager.java:88)
at project.Test.main(Test.java:10)
主应用
package project;
public class Test {
public static void main(String[] ages) {
//Load file
AnimalManager aMgr = new AnimalManager();
aMgr.loadFromFile("AnimalDetails.txt");
// try {
// Animals anim = aMgr.getAnimalById("48331827032019");
// aMgr.deleteAnimal(anim);
// } catch (IllegalArgumentException exc) {
// System.out.println(exc);
// }
System.out.println("Edit Animal:");
boolean edited = aMgr.editAnimal("48331827032019",5,"German","200","Huskies","Huskies","n","n",1000.0,"John"); //By ID
if (edited) {
System.out.println("Animal has been edited successfully.");
} else {
System.out.println("Animal not found (test failed).");
}
}
}
动物管理员
package project;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class AnimalManager {
private final ArrayList<Animals> animalList;
public AnimalManager() {
this.animalList = new ArrayList<>();
}
public boolean addAnimal(Animals a) {
if (a == null)
throw new IllegalArgumentException("Animal argument is null");
if(animalList.contains(a))
return false;
animalList.add(a);
return true;
}
public void deleteAnimal (Animals a) {
if (a == null)
throw new IllegalArgumentException("Animal argument is null");
animalList.remove(a);
}
public Animals getAnimalById(String ID) {
for (Animals a : this.animalList) {
if (a.getID().equals(ID))
return a;
}
return null;
}
public boolean editAnimal(String ID, int age,
String breed, String breedPurity, String motherBreed, String fatherBreed, String medicalHistory, String identification, double price, String owner) {
// test for null and for duplicate
if (ID == null || age == 0 || breed == null || breedPurity == null || motherBreed == null|| fatherBreed == null || medicalHistory == null|| price == 0 || owner == null)
throw new IllegalArgumentException("One or more arguments are null");
// Search for the animal.
for (Animals p: animalList) {
if (p.getID().equals(ID)) {
p.setAge(age);
p.setBreed(breed);
p.setMother(motherBreed);
p.setFather(fatherBreed);
p.setMedical(medicalHistory);
p.setIdenti(identification);
p.setPrice(price);
p.setOwner(owner);
return true; // Animal has been edited successfully.
}
}
return false; // Means animal with the supplied id is not found.
}
//Load from file
public void loadFromFile(String filename) {
try {
Scanner sc = new Scanner(new File(filename));
sc.useDelimiter("[,\r\n]+");
//animal details: id,age,breed,purity of breed,mother breed,father breed,medical history, identification, price, owner
while(sc.hasNext()) {
String ID = sc.next();
int age = sc.nextInt();
String breed = sc.next();
String breedPurity = sc.next();
String motherBreed = sc.next();
String fatherBreed = sc.next();
String medicalHistory = sc.next();
String identification = sc.next();
double price = sc.nextDouble();
String owner = sc.next();
animalList.add(new Animals(ID, age, breed, breedPurity, motherBreed, fatherBreed, medicalHistory, identification, price, owner ));
}
sc.close();
}catch (IOException e) {
System.out.println("Exception thrown. " + e);
}
}
public void saveToFile(String filename) {
StringBuilder output = new StringBuilder(); // To store all passengers info.
for (Animals p : animalList) { // Loop through the passengers to store
// every passenger as the line of strings to add them to the file.
output.append(p.getID()).append(",").append(p.getAge()).append(",").append(p.getBreed()).append(",")
.append(p.getMother()).append(",").append(p.getFather()).append(",").append(p.getMedical()).append(",")
.append(p.getIdenti()).append(",").append(p.getPrice()).append(",").append(p.getOwner()).append("\r\n");
}
try (FileWriter fw = new FileWriter(new File(filename))) {
fw.write(output.toString());
} catch (Exception e) {
System.out.println("Passengers cannot be saved: " + e);
}
}
public String toString() {
// use String if more comfortable with it - StringBuilding faster for concat
// than (immutable) String
StringBuilder strBuilder = new StringBuilder();
for (Animals p : this.animalList) {
strBuilder.append(p.toString()).append("\n");
}
return strBuilder.toString();
}
}
此处的想法是提供要编辑的特定动物ID,并写下新信息以替换旧信息。我已经有了保存到文件的方法,我认为这就是问题所在。
CSV
0,2,AmercianShorthair,100,AmercianShorthair,AmercianShorthair,y,y,900.0,Ann
3,4,GermanShepherd,100,GermanShepherd,GermanShepherd,no,yes,600.0,Dave
6,3,Poodle,100,Poodle,Poodle,yes,no,300.0,Dianna
456,4,Azawakh,50,Unknown,Azawakh,no,no,300.0,April
25041019042018,1,Vizsla,50,Vizsla,TreeingTennesseeBrindle,no,yes,500.0,Lex
3271,1,Beagle,50,Beagle,Unknown,no,no,200.0,Blanton
48331827032019,33,sheperd,50,50,50,no,yes,300.0,Mike
答案 0 :(得分:1)
CSV末尾应包含逗号,如下所示:
0,2,AmercianShorthair,100,AmercianShorthair,AmercianShorthair,y,y,900.0,Ann,
3,4,GermanShepherd,100,GermanShepherd,GermanShepherd,no,yes,600.0,Dave,
6,3,Poodle,100,Poodle,Poodle,yes,no,300.0,Dianna,
456,4,Azawakh,50,Unknown,Azawakh,no,no,300.0,April,
25041019042018,1,Vizsla,50,Vizsla,TreeingTennesseeBrindle,no,yes,500.0,Lex,
3271,1,Beagle,50,Beagle,Unknown,no,no,200.0,Blanton,
48331827032019,33,sheperd,50,50,50,no,yes,300.0,Mike
请注意行尾的逗号。发生了什么事,是立即转到下一行并将名称与开头的数字组合起来。例如,“ Ann3,4”,因为在这种情况下换行符不是分隔符。
在CSV中,您对Shepherd的拼写也不正确。
由于分隔符不是换行符,因此与之等效:
0,2,AmercianShorthair,100,AmercianShorthair,AmercianShorthair,y,y,900.0,Ann3,4,GermanShepherd,100,GermanShepherd,GermanShepherd,no,yes,600.0,Dave6,3,Poodle,100,Poodle,Poodle,yes,no,300.0,Dianna456,4,Azawakh,50,Unknown,Azawakh,no,no,300.0,April25041019042018,1,Vizsla,50,Vizsla,TreeingTennesseeBrindle,no,yes,500.0,Lex3271,1,Beagle,50,Beagle,Unknown,no,no,200.0,Blanton48331827032019,33,sheperd,50,50,50,no,yes,300.0,Mike
请注意它是怎么说的900.0,Ann3、4,等等。它会将所有内容都移位了一个,因此您实际上并没有将600.0读取为双精度,而是将Dave读为双精度。
像这样编辑代码:
for (Animals p : animalList) { // Loop through the passengers to store
// every passenger as the line of strings to add them to the file.
output.append(p.getID()).append(",").append(p.getAge()).append(",").append(p.getBreed()).append(",")
.append(p.getMother()).append(",").append(p.getFather()).append(",").append(p.getMedical()).append(",")
.append(p.getIdenti()).append(",").append(p.getPrice()).append(",").append(p.getOwner()).append(",").append("\r\n"); //add another append between getOwner and \r\n
}
请注意,这是将动物添加到CSV的地方。在这里,对于每只动物,现在也要在每行的末尾附加一个逗号。 ed在附加getOwner和附加\ r \ n之间。
答案 1 :(得分:1)
@JustAFellowCoder告诉您解决问题的方法,但我认为为此使用CVS文件不是最好的主意。
使用java.util.Properties怎么样? 这非常简单,可以解决所有问题,您可以执行以下操作:
//Your file path
Path path = Paths.get("Animal.properties");
//Create a new properties and store it in a file
Properties properties = new Properties();
//your id
int id = 1;
//Everything in properties must be saved as Strings
properties.setProperty("Id", String.valueOf(id));
properties.store(Files.newOutputStream(path), null);
//new properties
properties = new Properties();
properties.load(Files.newInputStream(path));
System.out.println("Id: " + properties.getProperty("Id"));
您将获得一个“ Animal.properties”文件,该文件可以轻松还原,并在控制台上显示“ Id:1”。