簡體   English   中英

不覆蓋現有文件所需的Java / Jaxb幫助

[英]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.existsif塊。

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM