[英]Java/Jaxb help needed on not overwriting existing file
我是JAXB的新手,請寬容您的評論! 無論如何,每次運行程序時,我都會遇到現有XML文件將被覆蓋的問題,這不是我想要的。 假定添加到現有xml上。 請幫忙!
CoursesApp.java:
package Courses;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class CoursesApp {
public static void main(String[] args) {
int choice;
String courseCode = "", professorName = "", groupIndex = "", classType = "";
Scanner sc = new Scanner(System.in);
try {
File file = new File("C:\\Courselist.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Courselist.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Courselist courselist = (Courselist) jaxbUnmarshaller.unmarshal(file);
System.out.println(courselist.course.get(0).getclassType());
} catch (JAXBException e) {
e.printStackTrace();
}
Courselist courselist = new Courselist();
Course course = new Course();
do{
System.out.println("(1) Add a student.\n" +
"(2) Add a course.\n" +
"(3) Exit.\n");
System.out.print("Enter the number of your choice: ");
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
case 1:
break;
case 2:
System.out.println("Please enter course code:");
courseCode = sc.nextLine();
System.out.println("Please enter class type:");
classType = sc.nextLine();
System.out.println("Please enter group index:");
groupIndex = sc.nextLine();
System.out.println("Please enter professor name:");
professorName = sc.nextLine();
course.setcourseCode(courseCode);
course.setclassType(classType);
course.setgroupIndex(groupIndex);
course.setprofessor(professorName);
courselist.course.add(course);
try{
File file = new File("C:\\Courselist.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Courselist.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(courselist, file);
jaxbMarshaller.marshal(courselist, System.out);
}catch(JAXBException e)
{
e.printStackTrace();
}
break;
case 3: //Modify course
break;
default: System.out.println("Please enter a number between 1-3.\n");
break;
}
} while (choice!=3);
}
}
Courselist.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<courselist>
<course>
<classType>lect</classType>
<courseCode>2002</courseCode>
<groupIndex>12</groupIndex>
<professor>james</professor>
</course>
</courselist>
如果我添加另一門課程,請轉到以下課程:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<courselist>
<course>
<classType>lect</classType>
<courseCode>2002</courseCode>
<groupIndex>12</groupIndex>
<professor>james</professor>
</course>
<course>
<classType>Lab</classType>
<courseCode>2001</courseCode>
<groupIndex>1</groupIndex>
<professor>john</professor>
</course>
</courselist>
以為我已經回答了這個問題,但是答案消失了...
首先不要這樣做:
} catch (JAXBException e) {
e.printStackTrace();
}
您正在捕獲異常,將文本轉儲到stdout,然后繼續進行,好像什么都沒發生一樣 。 這是IDE添加的無用樣板, 請不要這樣做 。
由於您想根據文件是否已經存在來限制您的行為,因此建議結合使用File.exists的if
塊。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class CoursesApp {
int choice;
String courseCode = "", professorName = "", groupIndex = "", classType = "";
private boolean exists;
Courselist courselist = new Courselist();
Course course = new Course();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Courselist courselist = new Courselist();
Course course = new Course();
try {
File file = new File("C:\\Courselist.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Courselist.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
courselist = (Courselist) jaxbUnmarshaller.unmarshal(file);
System.out.println(courselist);
} catch (JAXBException e) {
e.printStackTrace();
}
//* OVER HERE *//
CoursesApp ca = new CoursesApp();
ca.process(0);
}
private void process(int choice) {
//* PRINT MENU *//
System.out.println("(1) Add a student.\n"
+ "(2) Add a course.\n"
+ "(3) Exit.\n");
System.out.println("Enter the number of your choice: ");
Scanner sc = new Scanner(System.in);
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
case 1:
//ADD STUDENTS
break;
case 2:
File file = new File("C:\\Course.xml");
if (file.exists()) {
choice = 4;
exists = true;
} else {
System.out.println("File doesnot exist press 4 to create or 3 to exit: ");
choice = sc.nextInt();
sc.nextLine();
}
/*ENTER COURSE DETAILS*/
if (choice == 4) {
System.out.println("Please enter course code:");
courseCode = sc.nextLine();
System.out.println("Please enter class type:");
classType = sc.nextLine();
System.out.println("Please enter group index:");
groupIndex = sc.nextLine();
System.out.println("Please enter professor name:");
professorName = sc.nextLine();
course.setcourseCode(courseCode);
course.setclassType(classType);
course.setgroupIndex(groupIndex);
course.setprofessor(professorName);
courselist.course.add(course);
System.out.println("Are there more records?\n Press 2(yes) or 3(n): ");
choice = sc.nextInt();
sc.nextLine();
if (choice == 3) {
/*END OF RECORDS SO GO AHEAD AND UNMARSHAL*/
unmarshal(file, courselist);
} else {
/*ADD MORE COURSE ITEMS*/
process(2);
}
} else {
/*FILE NOT EXIST AND USER SELECTED EXIT*/
System.exit(0);
break;
}
break;
case 3:
System.exit(0);
break;
}
}
private void unmarshal(File file, Courselist courselist) {
{
FileWriter fw = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Courselist.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringBuffer str = new StringBuffer();
/*EXISTING FILE SO APPEND*/
if (exists) {
fw = new FileWriter(file, true);
jaxbMarshaller.marshal(courselist, fw);
}
/*CREATE NEW FILE*/
else {
jaxbMarshaller.marshal(courselist, file);
}
jaxbMarshaller.marshal(courselist, System.out);
} catch (IOException ex) {
Logger.getLogger(CoursesApp.class.getName()).log(Level.SEVERE, null, ex);
} catch (JAXBException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException ex) {
Logger.getLogger(CoursesApp.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
process(0);//call and print options
}
}
這將解決覆蓋問題,但是您需要一種方法來防止xml聲明重復。 希望這可以幫助
實際上,我已經將提問者發布的代碼和提取的代碼段分離為不同的方法,以便更好地理解。 我還添加了檢查以查看文件是否存在並添加到文件中,而不是覆蓋內容。
Process()方法用於用戶輸入,需要執行操作。 在unmarshal()中,用戶輸入綁定到xml文件。
您需要為此使用JAXB 2.x 活頁夾抽象。 詳細的教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.